如何在实例化自定义类型时触发依赖属性PropertyChangedCallback

本文关键字:依赖 属性 PropertyChangedCallback 类型 实例化 自定义 | 更新日期: 2023-09-27 17:54:28

我在自定义控件中设置了一个依赖属性,如下所示:

    public IChartData Data
    {
        get
        {
           return (IChartData)GetValue(DataProperty);
        }
        set
        {
            SetValue(DataProperty, value);
        }
    }
    public static readonly DependencyProperty DataProperty = DependencyProperty.Register
                                                             (
                                                                "Data",
                                                                typeof(IChartData),
                                                                typeof(ChartViewUserControl),
                                                                new FrameworkPropertyMetadata() { PropertyChangedCallback = UpdateCharting }
                                                             );

及其PropertyChangedCallback:

    private static void UpdateCharting(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        // Stuff Happens Here
    }

可以看到,依赖属性类型是IChartData。原因是我可以传递两种类型之一(SimpleChartData或ComplexChartData)。这两种类型都像这样扩展集合:

    public class SimpleChartData : ObservableCollection<ChartDataItem>, IChartData

    public class ComplexChartData : ObservableCollection<SimpleChartData>, IChartData

我的问题是,如果我创建这些类型之一的实例并添加到集合中,那么PropertyChangedCallback函数会按预期触发。但是,如果我需要清除集合,那么我只需将其实例化为new,但回调函数不会触发。我可以在使用控件的任何地方创建一个hack,但这显然不是理想的。如何使回调函数在自定义类型实例化时触发。如果有其他建议可以解决我的问题,我当然欢迎。

如何在实例化自定义类型时触发依赖属性PropertyChangedCallback

这个方法很脏,但是可以工作。将值更改为null并返回old将强制您更改属性回调。

collection.Clear();
foreach(var item in list)
{
   // refresh data
   var temp = item.Data;
   item.Data = null;
   item.Data = temp;
   collection.Add(item);
}

叹气…我是个十足的白痴。Michael Gunter评论并指出了我发布错误回调方法的错误。我的问题是粗心大意和糟糕的命名。我不仅在代码中发布了错误的方法,而且在更改Data属性时还检查了错误的触发方法。它一直工作正常,我最初的问题在别处。很抱歉我犯了这么愚蠢的错误,打扰了大家。不过,我确实很感激网景公司提供的每个人的意见和额外的教育。谢谢大家。