ComboBox в ListBox не запускает событие SelectionChanged - PullRequest
1 голос
/ 05 января 2012

У меня есть приложение 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....
}

1 Ответ

3 голосов
/ 05 января 2012

В привязке команд вы использовали привязку, которая имеет относительную привязку к источнику ...

рассмотрите возможность внесения этих изменений в связывание

1) использование списка в качестве Ancestortype

2) При связывании используйте Path = DataContext.SelectionChangedCommand, в противном случае поле списка будет воспринято как datacontext.

<catel:EventToCommand Command="{Binding Path=DataContext.SelectionChangedCommand, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBox}}}" DisableAssociatedObjectOnCannotExecute="False" PassEventArgsToCommand="True" />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...