У меня есть приложение wpf, mvvm, использующее catel (http://catel.codeplex.com) framework \ toolkit, C # .Net 4.0. Приложение имеет ListBox с TextBlock и ComboBox. ListBox и ComboBox заполняются из 2 различных ObservableCollection из ViewModel. Мне нужно сохранить (в дБ), когда пользователь нажимает кнопку, каждая строка в ListBox, где пользователь выбрал элемент из ComboBox. Событие SelectionChanged не срабатывает ни для одного из ComboBox в ListBox. Идея заключается в том, что я добавляю в список (ArrayList или IList?) В ViewModel каждый раз, когда пользователь выбирает элемент в ComboBox и для какой строки этот элемент был выбран.
Или я поступаю неправильно, пытаясь использовать событие ComboBoxe SelectionChanged? Я также пытался перебирать элементы ListBox.Items, но это похоже на хак, и я хочу по возможности избегать логики элементов пользовательского интерфейса во ViewModel.
XAML:
<Grid>
<StackPanel Orientation="Horizontal">
<Label Width="180">Field1</Label>
<ListBox Height="200"
IsSynchronizedWithCurrentItem="True"
ItemsSource="{Binding List1, Mode=OneWay}"
Name="listBox1"
SelectionMode="Single"
Width="300">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal" Width="290">
<TextBlock Width="90" Text="{Binding}"></TextBlock>
<ComboBox Width="180" ItemsSource="{Binding DataContext.List2, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}" DisplayMemberPath="Field1">
<i:Interaction.Triggers>
<i:EventTrigger EventName="SelectionChanged">
<catel:EventToCommand Command="{Binding SelectionChangedCommand, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ItemsControl}}}" DisableAssociatedObjectOnCannotExecute="False" PassEventArgsToCommand="True" />
</i:EventTrigger>
</i:Interaction.Triggers>
</ComboBox>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</StackPanel>
Код модели представления:
//in the ViewModel constructor
SelectionChangedCommand = new Command<SelectionChangedEventArgs>(OnSelectionChangedCommandExecute, OnSelectionChangedCommandCanExecute);
public Command<SelectionChangedEventArgs> SelectionChangedCommand { get; private set; }
private bool OnSelectionChangedCommandCanExecute()
{
return true;
}
private void OnSelectionChangedCommandExecute(SelectionChangedEventArgs e)
{
// add or update list....
}