Code中的绑定不会对源对象更改做出反应

时间:2012-08-08 03:12:09

标签: wpf binding datacontext code-behind

我在继承自adorner的类上有依赖属性,如下所示:

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)));

    ...
}

Adorner并没有真正的XAML,但我希望这个adorner的文本可以绑定到viewmodel。所以我在视图的构造函数中创建了代码中的绑定,如下所示:

    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绑定类似的响应?

1 个答案:

答案 0 :(得分:1)

绑定没有,不能对源更改做出反应,这是逻辑上的不可能性,对象不更改属性并且引用到对象更改。绑定可以对DataContext属性更改做出反应,但前提是执行像Source = DataContext那样可怕的操作,它通过仅获取当前数据上下文来杀死机制。只需删除它,以便DataContext再次成为默认源,绑定应对更改做出反应。

如果DataContext位于另一个对象而不是绑定的对象上,则需要将其移至Path,即new Binding("DataContext.LoadingText"){ Source = this }