假设有这种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),所以我们想要使用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绑定到子属性?
答案 0 :(得分:0)
简短回答 - 在XAML中,可能不是(至少没有编写自己的标记扩展名),在代码中,当然,但它对你没有任何用处。因为你的对象在视觉上没有关联(Foo
有一个 Bar
但是在XAML中无法知道这一点,你基本上只是对绑定进行硬编码,类似于你现在在XAML中的表现。
您为什么反对在INotifyPropertyChanged
上实施Foo
?