当属性在当前ObservableCollection中更改时,更新不同的ObservableCollection

时间:2011-09-13 09:11:44

标签: wpf xaml mvvm observablecollection

我有一个带有以下绑定的ItemsControl:

ItemsControl ItemsSource="{Binding SelectedItems}

集合中有10个SelectedItem,每个都有一个带有此绑定的组合框:

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 个答案:

答案 0 :(得分:1)

我认为您需要为该特定类实现INotifyPropertyChanged,并且您需要在属性更改时进行通知。如果您需要更多说明,请告诉我。

答案 1 :(得分:0)

您的课程需要实施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));
    }
}

然后在您的selectItems的setter中包括:

OnPropertyChanged("SelectableItems");

(来自this answer

答案 2 :(得分:0)

好的,所以我将SelectedItems ObservableCollection中的每个项目订阅到PropertyChanged事件,然后(回答问题)使用LINQ从SelectableItems ObservableCollection获取SelectableItem并设置属性:

    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;
    }

如果有更好的解决方案 - 请告诉我,谢谢。