UpdateSourceTrigger PropertyChanged на IsChecked не запускается на ItemsSource ListBox флажков - PullRequest
2 голосов
/ 18 апреля 2011

У меня есть список, в котором источник элемента содержит список (из T), который имеет логическое свойство SelectedFlag.Моя viewmodel установлена ​​как 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 ... не повезло.

1 Ответ

3 голосов
/ 19 апреля 2011

Вам нужно будет запустить событие 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");
}
...