Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 混合一次和双向绑定_Wpf_Binding - Fatal编程技术网

Wpf 混合一次和双向绑定

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

假设具有此类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内存泄漏。有两种解决方案:

  • 在上实现InotifyProperty更改
  • Foo使用一次性绑定
  • 我不喜欢1),所以我们想使用一次性绑定。 但我只需要访问Baz的一次性绑定,而我需要Baz的双向绑定:

    <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——你一定喜欢它,但有时你会讨厌它:-)