【问题标题】:Update a different ObservableCollection, when a property changes in the current ObservableCollection当当前 ObservableCollection 中的属性更改时,更新不同的 ObservableCollection
【发布时间】:2011-11-15 23:55:27
【问题描述】:

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

ItemsControl ItemsSource="{Binding SelectedItems}

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

ComboBox ItemsSource="{Binding SelectableItems}

当 SelectableItem 被选中时,SelectedItems ObservableCollection 会更新。然后,我希望禁用 SelectableItem,因此无法在任何其他组合框中选择它。

SelectableItem 的数量不等于 SelectedItem 的数量。

我在 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");
    }

如果不是,最好的解决方法是什么?

【问题讨论】:

    标签: wpf xaml mvvm observablecollection


    【解决方案1】:

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

    【讨论】:

    • 感谢 PraWiN,是的,我正在实施 INotifyPropertyChanged。
    • 能否请您提供更多代码以便我理解您的问题。
    • 感谢 PraWiN,进一步澄清:我的问题是,当我更改 Observable Collection 1 中的属性时,如何更新 Observable Collection 2 中的项目?
    • Joe,您只需要触发在任何属性的设置器中更改的属性。公共 bool MyProperty { 获取 { 返回 myProperty; } 设置 { myProperty= 值; OnPropertyChanged("MyProperty"); } }
    • 感谢 PraWiN - 但您不只是在这里为 Observable Collection 1 中的 MyProperty 引发 OnPropertyChanged 事件吗?如果我想在 MyProperty 更改时更改 ObservableCollection2.AnotherProperty 怎么办?
    【解决方案2】:

    你的类需要实现 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");
    

    (来自this answer

    【讨论】:

    • 谢谢 Skrealin,在这种情况下,如何从 ClassA ObservableCollection (SelectedItems) 更新 ClassB ObservableCollection (SelectableItems)?
    • 您可以在创建 ClassB 时将引用传递给 ClassA,然后调用包含 OnPropertyChanged() 的函数
    【解决方案3】:

    好的,所以我将 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;
        }
    

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

    【讨论】:

      猜你喜欢
      • 2018-05-18
      • 2021-11-26
      • 1970-01-01
      • 1970-01-01
      • 2016-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-09
      相关资源
      最近更新 更多