【问题标题】:DependencyProperty Object not updating to UIDependencyProperty 对象未更新到 UI
【发布时间】:2015-03-03 02:23:00
【问题描述】:

我正在为控件中的依赖属性而苦苦挣扎。我的依赖属性是一个看起来像这样的对象:

public class ChartGroupCollection : ObservableCollection<ChartGroup>, INotifyCollectionChanged
{
    public void ClearDirty()
    {
        foreach (var grp in base.Items)
        {
            foreach(var run in grp.ChartRuns.Where(x=>x.IsDirty))
            {
                run.IsDirty = false;
            }

            grp.IsDirty = false;
        }
    }

    [XmlIgnore]
    public bool IsDirty  //dirty flag for save prompt
    {
        get
        {
            ....
        }
    }

} 

[Serializable]
public class ChartGroup : INotifyPropertyChanged
{ ... //various properties }

DependencyProperty 设置如下(命名为 Tree,它是 ChartGroupCollection 的实例):

public static readonly DependencyProperty TreeProperty = DependencyProperty.Register("Tree", typeof(ChartGroupCollection), typeof(ChartsControl), new PropertyMetadata(OnTreeChanged));
    public ChartGroupCollection Tree
    {
        get { return (ChartGroupCollection)GetValue(TreeProperty); }
        set { SetValue(TreeProperty, value); }
    }
 private static void OnTreeChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
    {
        var Treee = sender as ChartsControl;
        if (e.OldValue != null)
        {
            var coll = (INotifyCollectionChanged)e.OldValue;
            coll.CollectionChanged -= Tree_CollectionChanged;
        }
        if (e.NewValue != null)
        {
            var coll = (ObservableCollection<ChartGroup>)e.NewValue;
            coll.CollectionChanged += Tree_CollectionChanged;
        }

    }

    private static void Tree_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
    {
        (sender as ChartsControl).OnTreeChanged();
    }

    void OnTreeChanged()
    {
        MessageBox.Show("Do something...");  //RefreshCharts();
    }

我似乎只在创建对象时才到达 OnTreeChanged 事件,但是一旦我做其他工作(添加到 ChartGroup 内的列表或更改 ChartGroup 对象的属性,甚至删除 observablecollection 的元素,它似乎永远不会触发刷新事件。我尝试了几种其他方法来获取在线找到的依赖属性,但没有解决方案对我有用。我想知道这是否取决于我的依赖属性对象的内在性质或我这边的错误

【问题讨论】:

    标签: c# wpf observablecollection dependency-properties inotifypropertychanged


    【解决方案1】:

    Tree_CollectionChanged 处理程序中的 sender 参数不是 ChartsControl 实例,而是引发 CollectionChanged 事件的集合。

    Tree_CollectionChanged 方法不应该是静态的

    private void Tree_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
    {
        OnTreeChanged();
    }
    

    它应该像这样附加和删除:

    private static void OnTreeChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
    {
        var control = sender as ChartsControl;
        var oldCollection = e.OldValue as INotifyCollectionChanged;
        var newCollection = e.NewValue as INotifyCollectionChanged;
    
        if (oldCollection != null)
        {
            oldCollection.CollectionChanged -= control.Tree_CollectionChanged;
        }
    
        if (newCollection != null)
        {
            newCollection.CollectionChanged += control.Tree_CollectionChanged;
        }
    }
    

    另请注意,添加 CollectionChanged 处理程序并不关心订阅集合元素的 PropertyChanged 事件。每当将元素添加到集合中或从集合中删除时,您还必须附加或删除 PropertyChanged 处理程序。查看NotifyCollectionChangedEventArgs.Action 属性。

    【讨论】:

    • 谢谢,您对静态的看法是正确的。我仍然坚持 control.TileLayerCollectionChanged 它做了什么,我需要添加什么代码才能使其工作?创建方法存根?
    • 这只是我的代码中的复制和粘贴错误。同时我已经编辑了答案。
    • 感谢您真正的快速回答。完美
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-23
    • 1970-01-01
    • 2011-12-01
    • 1970-01-01
    • 2020-04-21
    • 2013-03-13
    • 1970-01-01
    相关资源
    最近更新 更多