WPF绑定同一控件的两个依赖项属性,但需要两个datacontexts

时间:2015-01-20 11:48:41

标签: c# wpf

我在网格中有两个控件。

   <TextBlock Text="{Binding Name}" TextAlignment="Center" />
   <TextBox Visibility="{Binding ElementName=EditMode,Source={Binding RelativeSource=
                   {RelativeSource FindAncestor, AncestorType={x:Type Window}}}, 
                   Converter={StaticResource BoolToVis}}"  Text="{Binding Name}" 
                   TextAlignment="Center" />

我正在尝试实现类似可编辑/不可编辑的行为。我知道我可能会选择一个TextBox而只是改变IsEditable属性但是,在我的观点中,我需要DataContext,至少这就是我的想法。

在我的示例中,TextBlock工作正常,TextBox上的Text属性也可以正常工作但是对于Visibility部分,我想绑定到在其他某个层上找到的数据属性(EditMode,这是一个布尔值)。有没有办法将DataContext更改为,但仅限于可见性? Text属性应保持原样。

我应该尝试黑客攻击,定义一个不可见的复选框,单击我的编辑按钮时更改IsChecked并直接绑定到那个?我会尝试这个。我想是这样的,不需要改变DataContext。

2 个答案:

答案 0 :(得分:1)

在我看来,你几乎就在那里,你应该可以使用RelativeSource来做到这一点。问题是你误用了ElementName,ElementName是绑定到命名源的属性,而是用来代替RelativeSource。您打算使用的是Path,它是可选的,如下所示。

<TextBox Visibility="{Binding DataContext.EditMode, RelativeSource={RelativeSource AncestorType={x:Type Window}}, 
               Converter={StaticResource BoolToVis}}"
         Text="{Binding Name}" TextAlignment="Center" />

答案 1 :(得分:1)

@FrumRoll是正确的,您可以使用DataContext访问不在集合RelativeSource Binding对象中的属性。但是,我不确定他们的代码是否正确......试试这个:

<TextBox Visibility="{Binding DataContext.EditMode, RelativeSource={RelativeSource 
    AncestorType={x:Type YourXamlPrefix:MainWindow}}}, Converter={StaticResource 
    BoolToVis}}" Text="{Binding Name}" TextAlignment="Center" />

显然,您需要使用本地XAML命名空间前缀更改YourXamlPrefix值,并MainWindow更改Window的名称/类型(如果未调用{ {1}}。这也假定您已在MainWindow

中定义了EditMode属性

可能也有效,但并非专门寻找您的确切Window,因此可能会出现问题:

Window