Обновите другую ObservableCollection, когда свойство изменяется в текущей ObservableCollection - PullRequest
0 голосов
/ 13 сентября 2011

У меня есть ItemsControl со следующей привязкой:

ItemsControl ItemsSource="{Binding SelectedItems}

В коллекции 10 SelectedItems, у каждого из которых есть поле со списком с этой привязкой:

ComboBox ItemsSource="{Binding SelectableItems}

Когда SelectableItemвыбран SelectedItems ObservableCollection обновляетсяЗатем я бы хотел, чтобы SelectableItem был отключен, чтобы его нельзя было выбрать ни в одном из других комбинированных блоков.

Число SelectableItems не равно числу SelectedItems.

У меня естьследующий стиль для ComboBoxItem:

        <Style TargetType="{x:Type ComboBoxItem}">
            <Setter Property="IsEnabled" Value="{Binding IsSelectable}"/>
        </Style>

Это прекрасно работает при запуске - но проблема в том, что я обновляю SelectedItems ObservableCollection, я не обновляю коллекцию SelectableItems ..

Есть ли что-нибудь (LINQ?), Которое я могу поместить в событие SelectedItem.PropertyChanged, чтобы обновить соответствующий элемент в коллекции SelectableItems - так что-то вроде:

    public void SelectedItemObservableCollectionPropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        OnPropertyChanged("SelectableItem.IsSelectable");
    }

Если нет, какой лучший обходной путь?

Ответы [ 3 ]

1 голос
/ 13 сентября 2011

Я думаю, что вам нужно реализовать INotifyPropertyChanged для этого конкретного класса, и вам нужно уведомлять об изменении свойства. Дайте мне знать, если вам нужно больше разъяснений.

0 голосов
/ 13 сентября 2011

Хорошо, поэтому я подписал каждый элемент в SelectedItems ObservableCollection на событие PropertyChanged, затем (ответил на вопрос) получил SelectableItem из SelectableItems ObservableCollection с помощью LINQ и установил свойство:

    public void SelectedItemPropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        SelectedItem item = (SelectedItem)sender;

        var selectableItem = (from SelectableItem in _selectableItems
                           where (SelectableItem.Name == item.Name)
                           select SelectableItem).First();

        _selectableItems[selectableItem.Index].IsSelectable = false;
    }

Если есть лучшее решение - дайте мне знать, спасибо.

0 голосов
/ 13 сентября 2011

Вашему классу необходимо реализовать INotifyPropertyChanged:

class ClassA : INotifyPropertyChanged
{
    private bool _isEnabled;
    public bool IsEnabled
    {
        get { return _isEnabled; }
        set
        {
            if (value != _isEnabled)
            {
                _isEnabled = value;
                OnPropertyChanged("IsEnabled");
            }
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected void OnPropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
            handler(this, new PropertyChangedEventArgs(propertyName));
    }
}

Тогда в ваш сеттер для SelectedItems входят:

OnPropertyChanged("SelectableItems");

этот ответ )

...