C# 奇怪的WPF绑定行为

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; 使

当使用另一个绑定变量时,WPF中的UserControl绑定不起作用。 这是我的(简化)代码

我拥有此WPF用户控件的权限:

XAML:

主窗口 XAML:


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