C# WPF绑定同一控件的两个依赖属性,但需要两个DataContext
我在一个网格中有两个控件C# WPF绑定同一控件的两个依赖属性,但需要两个DataContext,c#,wpf,C#,Wpf,我在一个网格中有两个控件 <TextBlock Text="{Binding Name}" TextAlignment="Center" /> <TextBox Visibility="{Binding ElementName=EditMode,Source={Binding RelativeSource= {RelativeSource FindAncestor, AncestorType={x:Type Window}}},
<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" />
我试图实现类似可编辑/不可编辑的行为。我知道我可能会选择一个文本框,并简单地更改IsEditable属性,但在我的场景中,我仍然需要DataContext,至少我是这么想的
在我的示例中,TextBlock可以正常工作,TextBox上的Text属性也可以正常工作,但对于可见性部分,我希望绑定到其他层上的数据属性(EditMode,它是一个布尔值)。是否有一种方法可以将DataContext更改为那样,但仅限于可见性?文本属性应保持现在的状态
我是否应该尝试一种破解方法,定义一个不可见的复选框,当我的编辑按钮被点击时更改为选中并直接绑定到该复选框?我试试这个。我认为这样,就不需要更改数据上下文。在我看来,您已经差不多做到了,您应该能够使用相对资源来实现这一点。问题是您误用了ElementName,ElementName将绑定到命名源的属性,并将代替RelativeSource使用。您想要使用的是Path,它是可选的,如下所示
<TextBox Visibility="{Binding DataContext.EditMode, RelativeSource={RelativeSource AncestorType={x:Type Window}},
Converter={StaticResource BoolToVis}}"
Text="{Binding Name}" TextAlignment="Center" />
@FrumRoll正确的做法是,您可以使用
相对资源绑定
访问不在集合数据上下文
对象中的属性。但是,我不确定他们的代码是否正确。。。试试这个:
<TextBox Visibility="{Binding DataContext.EditMode, RelativeSource={RelativeSource
AncestorType={x:Type YourXamlPrefix:MainWindow}}}, Converter={StaticResource
BoolToVis}}" Text="{Binding Name}" TextAlignment="Center" />
为什么不将
EditMode
属性放入当前数据上下文中呢?关于
@Denis,如果我把它放在那里,我将进入一些集合迭代,以便在单击编辑按钮时更改它。这就是我试图将其保持在更高级别的原因,这意味着在我的窗口的datacontext中。@rraszewski这样做是因为我使用了错误的datacontext,即用于Text属性的datacontext。遵循MVVM将使结构更清晰:视图模型(数据内容)应提供通用视图能够表示数据所需的所有属性。如果您缺少一个,那么只需添加它即可。您可以将属性名称
绑定到TextBlock.Text
和属性IsNameEditable
(或其他)以实现可见性
。最后一个甚至可以是可见性
类型,以避免使用转换器的必要性。这样,您将在相同的数据内容中拥有所有属性-没有问题。确实,这看起来不错,但我得到了一个错误:不能在类型为“Binding”的“Source”属性上设置“Binding”。只能在DependencyObject的DependencyProperty上设置“Binding”。应删除“Source={Binding”和结尾“}”。设置源或相对源,而不是像您那样同时设置它们。@RobvanDaal这是正确的,我在复制OP时错过了这个错误。我已经修复了语法。
<TextBox Visibility="{Binding DataContext.EditMode, RelativeSource={RelativeSource
AncestorType={x:Type Window}}}, Converter={StaticResource BoolToVis}}"
Text="{Binding Name}" TextAlignment="Center" />