Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/310.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
C# WPF绑定同一控件的两个依赖属性,但需要两个DataContext_C#_Wpf - Fatal编程技术网

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" />