我在 WPF 中有一个可视化控件,它利用了依赖属性。这些属性由作为类的字段支持,有时需要通知所有绑定,属性值已更改,而实际上包含的类已被修改。
简单地说:
- MyDepProp 是 MyClass 类型;
- MyClass 的内容因控件的内部操作而改变;
- 我想通知大家,MyDepProp 发生了变化,这样他们就可以反映 MyClass 的变化。
MSDN 说,第一次使用依赖属性时,PropertyChanged 附加到 DependencyObject。它在 Visual Studio 2010 中工作。但是,在安装 Visual Studio 2012 后,它停止工作:即使使用了 DP(例如,绑定已附加到它),PropertyChanged 为空,我无法通知任何人更改。
我仍然使用 Visual Studio 2010 编译器工具包,所以看起来,这是一个损坏的框架问题,它与 VS 2012 一起更新。
我是否正确使用了 PropertyChanged 事件?还是 VS 2012 更新的 .NET 4.0 框架中的错误?有没有人遇到过类似的问题?
编辑:一段错误的代码:
public partial class MyImageControl : INotifyPropertyChanged,
IHandle<ImageRefresh>
{
// ***************************
// *** Dependency property ***
// ***************************
private void OnDataSourceChanged()
{
// ...
}
private static void DataSourceChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
if (d is MyImageControl)
((MyImageControl)d).OnDataSourceChanged();
}
public static readonly DependencyProperty DataSourceProperty = DependencyProperty.Register("DataSource",
typeof(IDataSource),
typeof(MyImageControl),
new PropertyMetadata(null, DataSourceChanged));
public IDataSource DataSource
{
get
{
return (IDataSource)GetValue(DataSourceProperty);
}
set
{
SetCurrentValue(DataSourceProperty, value);
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs("DataSource"));
}
}
// ***********************************
// *** INotifyPropertyChanged impl ***
// ***********************************
public event PropertyChangedEventHandler PropertyChanged;
// *************************************
// *** Method, which exposes the bug ***
// *************************************
public void Handle(ImageRefresh message)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs("BackgroundKind"));
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs("DataSource"));
}
}
作为参考,IHandle 接口:
public interface IBaseHandle { }
public interface IHandle<TMessage> : IBaseHandle
{
void Handle(TMessage message);
}
场景:
- DataSource使用_
Binding
- 有人调用
Handle
控件的方法(使用IHandle
接口) - 处理检查 PropertyChanged 是否不为空,因此不会传播有关 DataSource 中更改的信息。