混合一次和双向绑定

时间:2010-03-05 15:43:12

标签: wpf binding

假设有这种CLR对象:

public class Foo
{
    ...
    public Bar { get; private set; }
}

public class Bar: INotifyPropertyChanged
{
    public string Baz { get {...} set {...} }
}

现在我有一个Window,DataContext绑定到Foo的一个实例。在这个窗口中,我做了:

<TextBox Text={Binding Bar.Baz} />

因为Foo没有实现INotifyPropertyChanged,所以我会在这里得到一个众所周知的WPF内存泄漏。有两种解决方案:

  1. 上实施INotifyPropertyChange
  2. Foo使用OneTime绑定
  3. 我不喜欢1),所以我们想要使用OneTime绑定。 但是我只需要OneTime绑定来访问Bar,而我需要为Baz进行TwoWay绑定:

    <TextBox DataContext="{Binding Bar, Mode=OneTime}" Text={Binding Baz, Mode=TwoWay} />
    

    到目前为止一切都很好,但是如果现在需要将TextBox中的其他一些属性绑定到Foo的属性,事情会变得复杂,因为DataContext不再是Foo实例。

    所以这里有一个问题:有没有办法指定一个Bindig(在XAML或Code中)将OneTime绑定到父属性而TwoWay绑定到子属性?

1 个答案:

答案 0 :(得分:0)

简短回答 - 在XAML中,可能不是(至少没有编写自己的标记扩展名),在代码中,当然,但它对你没有任何用处。因为你的对象在视觉上没有关联(Foo 有一个 Bar但是在XAML中无法知道这一点,你基本上只是对绑定进行硬编码,类似于你现在在XAML中的表现。

您为什么反对在INotifyPropertyChanged上实施Foo