【发布时间】: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