gpt4 book ai didi

c# - DependencyProperty 中的属性已更改

转载 作者:行者123 更新时间:2023-12-01 23:06:42 27 4
gpt4 key购买 nike

previous post中我问如何将属性注册为 DependencyProperty。我得到了答案并且效果很好。

但现在我想在单击时向此 DependencyProperty 添加一些项目。这是行不通的。我注册 DependencyProperty 的代码是:

public static readonly DependencyProperty ChartEntriesProperty = DependencyProperty.Register(
"ChartEntries", typeof(ObservableCollection<ChartEntry>), typeof(ChartView),
new FrameworkPropertyMetadata(OnChartEntriesChanged));

private static void OnChartEntriesChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{

}

当我将 XAML 绑定(bind)到 C# 代码时,将调用 OnChartEntriesChanged-Event。但是,如果我随后添加 ChartEntry(单击按钮时),则不会触发该事件。

有谁知道为什么吗?

最佳答案

当您将项目添加到ChartEntries时集合,您实际上没有更改该属性,因此不会调用 PropertyChangedCallback。为了获得有关集合更改的通知,您需要额外注册 CollectionChanged事件处理程序:

private static void OnChartEntriesChanged(
DependencyObject obj, DependencyPropertyChangedEventArgs e)
{
var chartView = (ChartView)obj;
var oldCollection = e.OldValue as INotifyCollectionChanged;
var newCollection = e.NewValue as INotifyCollectionChanged;

if (oldCollection != null)
{
oldCollection.CollectionChanged -= chartView.OnChartEntriesCollectionChanged;
}

if (newCollection != null)
{
newCollection.CollectionChanged += chartView.OnChartEntriesCollectionChanged;
}
}

private void OnChartEntriesCollectionChanged(
object sender, NotifyCollectionChangedEventArgs e)
{
...
}
<小时/>

不使用 ObservableCollection<ChartEntry> 也是有意义的对于属性类型,只是 ICollectionIEnumerable反而。这将允许 INotifyCollectionChanged 的其他实现在具体的集合类型中。请参阅herehere了解更多信息。

关于c# - DependencyProperty 中的属性已更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19558862/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com