【发布时间】:2011-09-26 09:07:57
【问题描述】:
我有一个实现 INotifyPropertyChanged 的类。此类的实例在 Window 中声明为 DependencyProperty,例如,
public IMyClass MyClass
{
get { return (IMyClass)GetValue(MyClassProperty); }
set { SetValue(MyClassProperty, value); }
}
public static readonly DependencyProperty MyClassProperty=
DependencyProperty.Register("MyClass", typeof(IMyClass), typeof(MainWindow), new UIPropertyMetadata(null));
在 XAML 中,我有一个使用绑定到此类的元素
Text="{Binding MyClass, Converter={StaticResource someConverter}}
每当我更改 MyClass 中的属性时,我都希望触发 someConverter。但是,只有当我完全换掉 MyClass 时才会发生这种情况。有没有办法将 DependencyProperty 更新绑定到我的 MyClass PropertyChanged?
更新。本着 AresAvatar 解决方案的精神,这是我们目前所拥有的。剩下的问题是如何调用 InvalidateProperty(不让 MyClass 跟踪它......)
public IMyClass MyClass
{
get { return (IMyClass)GetValue(MyClassProperty); }
set { SetValue(MyClassProperty, value); }
}
public static readonly DependencyProperty MyClassProperty =
DependencyProperty.Register("MyClass", typeof(IMyClass), typeof(MainWindow),
new UIPropertyMetadata(null, new PropertyChangedCallback(OnMyClassChanged)));
private static void OnMyClassChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
if (e.OldValue != null)
{
((IMyClass)e.OldValue).PropertyChanged -= ((MainWindow)d).MyClass_PropertyChanged;
}
if (e.NewValue != null)
{
((IMyClass)e.NewValue).PropertyChanged += ((MainWindow)d).MyClass_PropertyChanged;
}
}
private void MyClass_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
this.InvalidateProperty(MyClassProperty); <----- still does not refresh binding, but called.
}
【问题讨论】:
-
我遇到了类似的问题,仍然没有解决:stackoverflow.com/questions/6363883/…
-
dthorpe,我在下面的回答也应该适用于您的问题。您想将 NotifyPropertyChanged 挂钩到绑定失效中,就像这里的 tofutim 一样。
-
@dthorpe - 你的问题很有帮助。
-
尝试使用这个:BindingExpressionBase exp = BindingOperations.GetBindingExpressionBase(this, Container.MyClassProperty); if (exp != null) exp.UpdateTarget();
-
我尝试了 UpdateTarget 和 InvalidateProperty 选项,但没有成功。然而,他们正在被召唤。我认为底层 Binding 代码必须对对象是否相同进行一些检查,并且不能强制重新调用 Converter。
标签: c# wpf xaml data-binding dependency-properties