【问题标题】:Why does UpdateSourceTrigger occur when changing ObservableCollection but not replacing it?为什么更改 ObservableCollection 但不替换它时会发生 UpdateSourceTrigger?
【发布时间】:2011-06-21 21:39:17
【问题描述】:

我刚开始使用 WPF,正在尝试了解数据绑定。

在我的项目中,我有一个绑定到属性的列表框,该属性从 DependancyProperty 获取/设置。

如果我这个属性是 ObservableCollection(并且我将 UpdateSourceTrigger 设置为 PropertyChanged),我的列表框正确地表示集合的内容并使用它进行更新。 但是,当我将收藏完全换成新收藏时,它不再更新。

这是为什么?列表框是否永久绑定到该特定对象? Set 访问器中的 SetValue() 是否应该不使其绑定到新的,并相应地更新?

【问题讨论】:

    标签: wpf binding dependency-properties observablecollection


    【解决方案1】:

    UpdateSourceTrigger 仅影响从控件更改更新源的时间。它与您对对象本身所做的事情无关。

    我非常不鼓励您覆盖对集合的引用,因为任何还需要集合的 CollectionChanged 事件的事件处理程序都需要重新连接。

    如果您绑定到依赖属性,我不确定如何处理通知,但是如果您更改源并且它不是 DP,则需要通知绑定。这可以通过实现INotifyPropertyChanged 来完成。

    例如

        private ObservableCollection<Stuff> data = new ObservableCollection<Stuff>();
        public ObservableCollection<Stuff> Data
        {
            get { return data ; }
            set
            {
                data = value;
                NotifyPropertyChanged("Data");
            }
        }
    
        public event PropertyChangedEventHandler PropertyChanged;
    
        private void NotifyPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }
    

    编辑:测试了交换存储在 DP 中的集合,对我来说,它按预期工作并且列表得到更新,显示新集合。

    【讨论】:

    • 感谢您的解释。我的第一次尝试是使用值类型,所以我对触发器和 SetValue() 的来源有点困惑。也感谢您解释 INotifyPropertyChanged,我知道我需要“类似的东西”,但到目前为止,我一直躲避着那个东西!
    • 这是一件人们不知道的很常见的事情。谢天谢地,每个人只需要学习一次 :)
    猜你喜欢
    • 1970-01-01
    • 2022-11-14
    • 2015-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-02
    • 1970-01-01
    相关资源
    最近更新 更多