C# 奇怪的WPF绑定行为
当使用另一个绑定变量时,WPF中的UserControl绑定不起作用。 这是我的(简化)代码 我拥有此WPF用户控件的权限: XAML: 主窗口 XAML:C# 奇怪的WPF绑定行为,c#,wpf,xaml,data-binding,C#,Wpf,Xaml,Data Binding,当使用另一个绑定变量时,WPF中的UserControl绑定不起作用。 这是我的(简化)代码 我拥有此WPF用户控件的权限: XAML: 主窗口 XAML: C#: 使用系统; 使用System.Collections.Generic; 使用System.Collections.ObjectModel; 使用System.Linq; 使用系统文本; 使用System.Threading.Tasks; 使用System.Windows; 使用System.Windows.Controls; 使
C#:
使用系统;
使用System.Collections.Generic;
使用System.Collections.ObjectModel;
使用System.Linq;
使用系统文本;
使用System.Threading.Tasks;
使用System.Windows;
使用System.Windows.Controls;
使用System.Windows.Data;
使用System.Windows.Documents;
使用System.Windows.Input;
使用System.Windows.Media;
使用System.Windows.Media.Imaging;
使用System.Windows.Navigation;
使用System.Windows.Shapes;
使用Kadaster.newslettes.DomainModel;
命名空间WpfApplication
{
///
///MainWindow.xaml的交互逻辑
///
公共部分类主窗口:窗口
{
公共字符串hoi=>“yYy”;
公共主窗口()
{
DataContext=this;
初始化组件();
}
}
}
我期望的结果是:
yYy yYy XxX XxX
相反,我得到:
yYy XxX XxX XxX
BindingTest控件不打印yYy文本,而TextBlock打印。
知道原因吗?TomerAgmon1在评论中指出,您更改了用户控件的
DataContext
。要解决此问题,您可以使用例如相对资源
<local:BindingTest Test="{Binding DataContext.hoi, RelativeSource={RelativeSource AncestorType=local:MainWindow, Mode=FindAncestor}}"/>
Tomemagon1在注释中正确指出,您更改了用户控件的
DataContext
。要解决此问题,您可以使用例如相对资源
<local:BindingTest Test="{Binding DataContext.hoi, RelativeSource={RelativeSource AncestorType=local:MainWindow, Mode=FindAncestor}}"/>
UserControl中的绑定表达式不正确,无法在UserControl中将DataContext设置为this 1) 删除DataContext分配:
public BindingTest()
{
InitializeComponent();
}
2) 在UserControl XAML中,将绑定替换为以下内容:
<TextBlock Text="{Binding RelativeSource={RelativeSource
Mode=FindAncestor, AncestorType=local:BindingTest},
Path=Test}" />
您的UserControl中的绑定表达式不正确,您无法在UserControl中将DataContext设置为this 1) 删除DataContext分配:
public BindingTest()
{
InitializeComponent();
}
2) 在UserControl XAML中,将绑定替换为以下内容:
<TextBlock Text="{Binding RelativeSource={RelativeSource
Mode=FindAncestor, AncestorType=local:BindingTest},
Path=Test}" />
您指定BindingTest
的DataContext
始终是this
。当您在MainWindow.xaml
中引用BindingTest
时,它无法识别属性
hoi
,因为它是MainWindow.cs
的一部分,而不是它的DataContext
。解决此问题的一种方法是,不要使BindingTest
成为自己的DataContext
,并以不同的方式将TextBlock
绑定到属性Test
。您可以给UserControl
一个x:Name
,然后像这样绑定到它:``顺便说一句,通过使用snoop
工具,您可以看到绑定错误,还可以识别DataContext
每个元素都有什么。但我的实际情况有点复杂,我的控件有DataContext=this,因为这似乎是让控件观察其codebehind属性的方法。我是否完全做错了什么?我的控件是这样调用的:然后使用嵌套的ItemsControls,它会按照每个部门的语言呈现文本编辑器。如果不使用DataContext=this,我将如何绑定这些属性并在某些内容发生更改时更新UI?我想一定有很多方法可以做到这一点,但正如我所说,您可以使用ElementName
进行绑定。这样,您可以维护DataContext
继承您指定BindingTest
的DataContext
始终是this
。当您在MainWindow.xaml
中引用BindingTest
时,它无法识别属性
hoi
,因为它是MainWindow.cs
的一部分,而不是它的DataContext
。解决此问题的一种方法是,不要使BindingTest
成为自己的DataContext
,并以不同的方式将TextBlock
绑定到属性Test
。您可以给UserControl
一个x:Name
,然后像这样绑定到它:``顺便说一句,通过使用snoop
工具,您可以看到绑定错误,还可以识别DataContext
每个元素都有什么。但我的实际情况有点复杂,我的控件有DataContext=this,因为这似乎是让控件观察其codebehind属性的方法。我是否完全做错了什么?我的控件是这样调用的:然后使用嵌套的ItemsControls,它会按照每个部门的语言呈现文本编辑器。如果不使用DataContext=this,我将如何绑定这些属性并在某些内容发生更改时更新UI?我想一定有很多方法可以做到这一点,但正如我所说,您可以使用ElementName
进行绑定。这样,您就可以维护DataContext
inheritance所有的反应都很有帮助,但这是最正确和完整的。如果您解释了为什么使用DataContext=这是一种糟糕的做法以及替代方案是什么,那么它将更加完美。所有的反应都是有帮助的,但这一个是最正确和完整的。如果您解释了为什么使用DataContext=这是一种不好的做法,以及替代方法是什么,那就更完美了。
public BindingTest()
{
InitializeComponent();
}
<TextBlock Text="{Binding RelativeSource={RelativeSource
Mode=FindAncestor, AncestorType=local:BindingTest},
Path=Test}" />