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

时间:2014-03-27 21:46:09

标签: c# wpf dependency-properties

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

    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函数将按预期触发。但是,如果我需要清除集合,那么我只是将其实例化为新的但回调函数不会触发。我可以在任何地方创建一个使用控件的黑客,但这显然不理想。如何在实例化自定义类型时获取要触发的回调函数。其他解决我问题的建议当然是受欢迎的。

2 个答案:

答案 0 :(得分:0)

这种方法非常脏但可行。将值更改为null并返回旧值将强制您进行propertychanged回调。

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

答案 1 :(得分:0)

叹息......我是一个完全白痴。迈克尔冈特评论并指出我错误的发布错误的回调方法。我的问题是粗心和命名不佳的结合。我不仅在我的代码中发布了错误的方法,我还在更改Data属性时检查了错误的触发方法。它一直正常工作,我最初的问题在其他地方。我很抱歉打扰了所有人,我犯了这么愚蠢的错误。然而,我很欣赏每个人的意见和NETscape提供的额外教育。谢谢大家。