UpdateSourceTrigger PropertyChanged on IsChecked Не срабатывает для ItemsSource of ListBox of Checkboxes

У меня есть список, в котором источник элемента содержит список (из T), который имеет логическое свойство SelectedFlag. Моя модель представления установлена ​​как DataContext моего пользовательского элемента управления, и все работает так, как ожидалось, за исключением того, что я не могу получить изменение свойства, даже если флажок изменен.

Вот мой xaml ListBox

<ListBox x:Name="lstRole" ItemsSource="{Binding Path=FAccountFunctions, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" SelectedValuePath="Id">
                <ListBox.ItemTemplate>
                    <DataTemplate>
                        <StackPanel Orientation="Horizontal">
                            <CheckBox IsChecked="{Binding Path=SelectedFlag, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" VerticalAlignment="Center" />
                            <TextBlock Text="{Binding Path=FunctionDesc}" VerticalAlignment="Center" />
                        </StackPanel>
                    </DataTemplate>
                </ListBox.ItemTemplate>
            </ListBox>

Мне нужно вызвать мою функцию Filter() после того, как установлен флажок, и я обычно устанавливаю UpdateSourcTrigger=PropertyChanged, чтобы это работало.

Public Property FAccountFunctions As List(Of FunctionType)
        Get
            Return _faccountFunctions
        End Get
        Set(ByVal value As List(Of FunctionType))
            _faccountFunctions = value
            Filter()
        End Set
    End Property

Событие PropertyChangedEvent вызывается для свойства SelectedFlag в коллекции FAccountFunctions. Как вызвать событие в источнике элементов при изменении одного из свойств SelectedFlag?

Изменил мое свойство FAccountFunctions на ObservableCollection... не повезло.


person knockando    schedule 18.04.2011    source источник


Ответы (1)


Вам нужно будет вызвать событие CollectionChanged вашей коллекции, когда сработает событие PropertyChanged вашего элемента.

Что-то типа:

MyCollection.CollectionChanged += MyCollectionChanged;

...

void MyCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
    if (e.NewItems != null)
    {
        foreach (object item in e.NewItems)
        {
            if (item is MyItem)
                ((MyItem)item).PropertyChanged += MyItem_PropertyChanged;
        }
    }

    if (e.OldItems != null)
    {
        foreach (object item in e.OldItems)
        {
            if (item is MyItem)
                ((MyItem)item).PropertyChanged -= MyItem_PropertyChanged;
        }
    }
}

...

void MyItem_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
    OnPropertyChanged("MyCollection");
}
person Rachel    schedule 18.04.2011
comment
Спасибо за Ваш ответ! Я реализовал ваше решение, но MyCollectionChanged не вызывается. Я помещаю AddHandler FAccountFunctions.CollectionChanged, AddressOf MyCollectionChanged в конструктор моей ViewModel перед загрузкой коллекции. Из-за этого MyItem_PropertyChanged никогда не вызывается. Возможно, мне придется использовать событие Checked в моем коде :( - person knockando; 19.04.2011
comment
@knockando Используете ли вы ObservableCollection для MyCollection? И вы создаете ObservableCollection ПЕРЕД присоединением события CollectionChanged? Если вы создаете его позже, новый объект не будет иметь прикрепленного события Changed. - person Rachel; 19.04.2011
comment
В настоящее время я борюсь с проблемой, которую вы ответили выше, чтобы дать решение. Моя реализация более или менее параллельна вашей выше, но когда я вызываю OnPropertyChanged(MyCollection) в обработчике событий с изменением элемента, ничего не происходит, связанного с MyCollection, особенно не происходит обновления в свойствах привязанных к данным целевых зависимостей в другом классе. Поэтому в крайнем случае я добавил элемент и сразу же удалил его - это дало мне реакцию в связанном свойстве зависимости, но это, конечно, некрасиво. Можете ли вы пролить свет на то, что здесь происходит? - person Jürgen Böhm; 26.06.2021
comment
Теперь я нашел решение: вместо вызова OnPropertyChanged(MyCollection) я сделал MyCollection[0] = MyCollection[0]. Странно (?) Это сработало! - person Jürgen Böhm; 26.06.2021