1

我有一个从装饰器继承的类的依赖属性,如下所示:

public class LoadingAdorner : Adorner
{
    public static readonly DependencyProperty TextProperty = DependencyProperty.Register("Text", typeof (string), typeof (LoadingAdorner), new PropertyMetadata(default(string)));

    public string Text
    {
        get { return (string) GetValue(TextProperty); }
        set { SetValue(TextProperty, value); }
    }

    public static readonly DependencyProperty IsShowingProperty = DependencyProperty.Register("IsShowing", typeof (bool), typeof (LoadingAdorner), new PropertyMetadata(default(bool)));

    ...
}

装饰器实际上没有任何 XAML,但我希望此装饰器的文本可绑定到视图模型。所以我在代码中创建绑定,在视图的构造函数中,如下所示:

    private readonly LoadingAdorner _loading;

    public MainWindow()
    {
        InitializeComponent();
        _loading = new LoadingAdorner(MainPage);
        var bind = new Binding("LoadingText"){Source = DataContext};
        _loading.SetBinding(LoadingAdorner.TextProperty, bind);
    }

DataContext 是我的视图模型,我的视图模型实现了 INotifyPropertyChanged,LoadingText 是一个调用 OnPropertyChanged 的​​字符串属性等。XAML 中的所有绑定都可以正常工作,但是代码绑定不能。

我相信是因为在创建绑定的时候,视图模型还没有被设置为DataContext(它是null),我在创建视图之后就行了。如果我使用 Source = this 将此绑定设置为视图上的属性,则它可以工作。

我的问题是,为什么 XAML 绑定能够对源对象的变化做出反应,而代码绑定似乎没有?我是否有合适的方法来创建一个绑定,该绑定将对此类似于 XAML 绑定作出反应?

4

1 回答 1

1

绑定不会也不能对源更改做出反应,这在逻辑上是不可能的,对象不会更改属性并且对对象的引用会更改。绑定可以对DataContext属性更改做出反应,但前提是您不做一些可怕的事情,例如Source = DataContext通过仅获取当前数据上下文一次来杀死机制。只需将其删除,以便DataContext再次成为默认源,并且绑定应该对更改做出反应。

如果DataContext位于绑定对象之外的另一个对象上,则需要将其移动到 中Path,即new Binding("DataContext.LoadingText"){ Source = this }

于 2012-08-08T08:23:07.207 回答