sch*_*ola 3 wpf user-controls dependency-properties propertychanged
如果有一个带有DependencyProperty的自己的用户控件和相应的回调方法,如下所示:
public partial class PieChart : UserControl
{
public static readonly DependencyProperty RatesProperty = DependencyProperty.Register("Rates", typeof(ObservableCollection<double>), typeof(PieChart),
new PropertyMetadata(new ObservableCollection<double>() { 1.0, 1.0 }, new PropertyChangedCallback(OnRatesChanged)));
[...]
public static void OnRatesChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
((PieChart)d).drawChart();
}
Run Code Online (Sandbox Code Playgroud)
使用此用户控件时,我将名为"Rates"的ObservableCollection绑定到RatesProperty.费率和相关方法如下所示:
private ObservableCollection<double> rates;
public ObservableCollection<double> Rates
{
get { return this.rates; }
set
{
if (this.rates != value)
{
this.rates = value;
OnPropertyChanged("Rates");
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
Run Code Online (Sandbox Code Playgroud)
当我更改ObservableCollection this.Rates = new ObservableCollection<double>() { 1.0, 2.0 }Rate (例如with )时,用户控件的OnRatesChanged()方法被调用为expect.但是当我执行以下操作时,它不会被调用:
this.Rates[0] = (double)1;
this.Rates[1] = (double)2;
OnPropertyChanged("Rates");
Run Code Online (Sandbox Code Playgroud)
我期望当我使用正确的属性名称引发PropertyChanged事件时,始终会调用用户控件中的相应回调.那是错的吗?我找到了这个主题:总是获取依赖属性的PropertyChangedCallback - Silverlight 覆盖了Silverlight,但我认为在WPF中也是如此.
所以后台的框架检查绑定属性(在我的例子中"Rate")是否发生了变化,只有当它发生变化时,才会调用相关的回调,对吗?因此改变我的收藏元素没有任何效果,我总是要改变完整的收藏?
谢谢!
您的结论是正确的,OnRatesChanged只有在Rates依赖属性设置为新集合(或null)时才会调用您的回调.
为了获得有关集合中更改的通知,您还必须注册NotifyCollectionChangedEventHandler:
private static void OnRatesChanged(
DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var pieChart = (PieChart)d;
var oldRates = e.OldValue as INotifyCollectionChanged;
var newRates = e.NewValue as INotifyCollectionChanged;
if (oldRates != null)
{
oldRates.CollectionChanged -= pieChart.OnRatesCollectionChanged;
}
if (newRates != null)
{
newRates.CollectionChanged += pieChart.OnRatesCollectionChanged;
}
pieChart.drawChart();
}
private void OnRatesCollectionChanged(
object sender, NotifyCollectionChangedEventArgs e)
{
switch (e.Action)
{
...
}
drawChart();
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8076 次 |
| 最近记录: |