Wpf 混合一次和双向绑定
假设具有此类CLR对象:Wpf 混合一次和双向绑定,wpf,binding,Wpf,Binding,假设具有此类CLR对象: public class Foo { ... public Bar { get; private set; } } public class Bar: INotifyPropertyChanged { public string Baz { get {...} set {...} } } 现在我有了一个窗口,其中DataContext绑定到一个Foo实例。在这个窗口中,我做: <TextBox Text={Binding Bar.Baz
public class Foo
{
...
public Bar { get; private set; }
}
public class Bar: INotifyPropertyChanged
{
public string Baz { get {...} set {...} }
}
现在我有了一个窗口,其中DataContext绑定到一个Foo实例。在这个窗口中,我做:
<TextBox Text={Binding Bar.Baz} />
因为Foo没有实现INotifyPropertyChanged,所以我将在这里得到一个众所周知的WPF内存泄漏。有两种解决方案:
<TextBox DataContext="{Binding Bar, Mode=OneTime}" Text={Binding Baz, Mode=TwoWay} />
到目前为止还不错,但是如果TextBox中的其他属性现在需要绑定到Foo的属性,事情就会变得复杂,因为DataContext不再是Foo实例
所以这里有一个问题:有没有一种方法可以指定一个Bindig(在XAML或代码中),它一次绑定到父属性,二次绑定到子属性?简短的回答-在XAML中,可能没有(至少没有编写自己的标记扩展),在代码中,当然,但它对您没有任何用处。因为您的对象在视觉上是不相关的(一个
Foo
有一个Bar
,但是在XAML中没有办法知道这一点),所以您基本上只需要硬编码绑定,就像您现在在XAML中所做的那样
为什么您反对在
Foo
上实现INotifyPropertyChanged
?只是觉得实现INotifyPropertyChanged而从不使用它是不对的。可能没有简单的方法可以避免这种情况,但这很难看。但这就是WPF——你一定喜欢它,但有时你会讨厌它:-)