如何在DependencyProperty中传播PropertyChanged更改

tof*_*tim 11 c# data-binding wpf xaml dependency-properties

我有一个实现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));
Run Code Online (Sandbox Code Playgroud)

在XAML中,我有一个绑定到此类的元素

Text="{Binding MyClass, Converter={StaticResource someConverter}}
Run Code Online (Sandbox Code Playgroud)

每当我在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.
    }
Run Code Online (Sandbox Code Playgroud)

H.B*_*.B. 7

转换器不应该做比简单转换更多的工作,你的问题听起来像转换器使用对象的许多属性来创建一些组合值.使用MultiBinding,而不是它挂接到你所需要的对象的所有不同的属性,这种方式,MultiValueConverterMultiBinding将火是否有这些性能的改变.

此外,由于您似乎创建了文本,因此您可以在不使用任何转换器的情况下离开,因为StringFormat可能就足够了.