【问题标题】:How to fire Dependency property PropertyChangedCallback when instantiating custom type实例化自定义类型时如何触发依赖属性 PropertyChangedCallback
【发布时间】:2014-03-27 21:46:09
【问题描述】:

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

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

【问题讨论】:

  • 不要将它实例化为新的,这很不聪明。做collection.Clear()
  • 您的 PropertyChangedCallback 实际上是您的方法,称为UpdateCharting。请将其添加到您的帖子中,以便我们查看其中出了什么问题。
  • 是的,迈克尔一发布就看到了我的错误。它是固定的。对此感到抱歉。
  • 我不是在和你争论 NETscape,但你能告诉我为什么我不想将它实例化为新的吗?我会感激教育。谢谢。
  • 我在 .Clear() 与实例化为新的方面做了一些阅读,看来 .Clear() 为垃圾收集提供了旧值。非常好的信息,我应该知道但没有。谢谢你,但我确实检查了 .Clear() 是否会触发回调函数,这是一个否定的。还是个问题。

标签: c# wpf dependency-properties


【解决方案1】:

这种方法很脏,但会奏效。将 value 更改为 null 并返回 old 将强制您进行 propertychanged 回调。

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

【讨论】:

    【解决方案2】:

    叹息...我是个十足的白痴。 Michael Gunter 评论并指出了我发布错误回调方法的错误。我的问题是粗心和糟糕的命名。我不仅在我的代码中发布了错误的方法,而且当 Data 属性更改时,我还检查了错误的触发方法。它一直正常工作,我最初的问题在其他地方。很抱歉因为我犯了这么愚蠢的错误而打扰到大家。不过,我非常感谢大家的投入和 NETscape 提供的额外教育。谢谢大家。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-25
      • 1970-01-01
      • 2016-11-29
      • 2010-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多