【问题标题】:Mixing OneTime and TwoWay binding混合一次和两次绑定
【发布时间】:2010-03-05 15:43:12
【问题描述】:

假设有这种 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} />

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

  1. 上实现 INotifyPropertyChange
  2. Foo 使用 OneTime 绑定

我不喜欢 1),所以假设我们想使用 OneTime 绑定。 但是我只需要 OneTime 绑定来访问 Bar,而我需要 TwoWay 绑定来访问 Baz:

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

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

那么问题来了:有没有办法指定将 OneTime 绑定到父属性并将 TwoWay 绑定到子属性的 Bindig(在 XAML 或代码中)?

【问题讨论】:

    标签: wpf binding


    【解决方案1】:

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

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

    【讨论】:

    • 实现 INotifyPropertyChanged 并且从不使用它只是感觉不对。可能没有简单的方法可以避免这种情况,但这很丑陋。但这就是 WPF - 你必须喜欢它,但有时你会讨厌它 :-)
    猜你喜欢
    • 2016-01-29
    • 2014-05-20
    • 1970-01-01
    • 1970-01-01
    • 2016-12-23
    • 2011-01-13
    • 1970-01-01
    • 1970-01-01
    • 2014-08-13
    相关资源
    最近更新 更多