Свойство SelectedItem не обновляется
Относительно новичок в C# и MVVM, но я создаю приложение WP7 с использованием легкого инструментария MVVM. У меня проблема с двухсторонним связыванием свойства в ListBox. У меня есть ObservableCollection клиентов, и я пытаюсь выбрать отдельного клиента (который при нажатии приведет меня к новой ViewModel).
Когда я щелкаю по выбранному элементу, он должен обновить свойство SelectedItem и установить значение, по которому клиент нажал. Однако при нажатии он даже не достигает установщика (я пометил точку останова *). Кто-нибудь знает, где я ошибся или есть лучшее решение? Я тралял это место часами!
XAML MarkUp:
<ListBox SelectedItem="{Binding SelectedItem, Mode=TwoWay}" ItemsSource="{Binding ClientList, Mode=TwoWay}" x:Name="FirstListBox" Margin="0,0,-12,0" ScrollViewer.VerticalScrollBarVisibility="Auto">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Margin="0,0,0,17" Width="432">
<Button CommandParameter="{Binding}">
<helper:BindingHelper.Binding>
<helper:RelativeSourceBinding Path="ShowClientCommand" TargetProperty="Command"
RelativeMode="ParentDataContext" />
</helper:BindingHelper.Binding>
<Button.Template>
<ControlTemplate>
<TextBlock Text="{Binding Name}" TextWrapping="Wrap" Style="{StaticResource PhoneTextExtraLargeStyle}" />
</ControlTemplate>
</Button.Template>
</Button>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
Свойства ViewModel:
public ObservableCollection<Client> ClientList
{
get
{
return _clientList;
}
set
{
_clientList = value;
RaisePropertyChanged("ClientList");
}
}
public Client SelectedItem
{
get
{
return _selectedItem;
}
set
{
* _selectedItem = value;
RaisePropertyChanged("SelectedItem");
}
}
1 ответ
Может ли быть так, что, поскольку вы не подписаны на событие selection_changed, оно не меняет свойство?
Я не совсем уверен, почему это не работает, но вот решение, которое я всегда использую и которое рекомендуют шаблоны.
Зарегистрируйте свой список для события SelectionChanged следующим образом:
<ListBox SelectionChanged="FirstListBox_SelectionChanged" ItemsSource="{Binding ClientList, Mode=TwoWay}" x:Name="FirstListBox" Margin="0,0,-12,0" ScrollViewer.VerticalScrollBarVisibility="Auto">
Затем в соответствующем файле.cs есть обработчик, который выглядит следующим образом:
private void FirstListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
// If selected index is -1 (no selection) do nothing
if (FirstListBox.SelectedIndex == -1)
return;
// get the client that's selected
Client client = (Client) FirstListBox.selectedItem;
//... do stuff with the client ....
// reset the index (note this will fire this event again, but
// it'll automatically return because of the first line
FirstListBox.SelectedIndex = -1;
}