我是数据绑定的新手,我很难为我的WPF应用程序设置它:
我有一个类Test,它实现了INotifyPropertyChanged和一个属性Text。
当我在代码隐藏中执行此操作时:
Binding b = new Binding("Text");
b.Source = Test;
label1.SetBinding(ContentProperty, b);
一切都很好。
当我在XAML中做同样的事情时:
Content="{Binding Source=Window.Test, Path=Text}"
标签内容不会更新。
我想避免在代码隐藏中执行此操作,我做错了什么?
答案 0 :(得分:1)
最简单的解决方案是在XAML中为窗口命名(例如root
)并使用ElementName
来定义绑定源:
Content="{Binding ElementName=root, Path=Test.Text}"
答案 1 :(得分:0)
为简单起见,将窗口DataContext设置为Test
实例:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
DataContext = new Test
{
Text = "Hello, World!"
};
}
}
然后在XAML中声明数据绑定:
Content="{Binding Path=Text}"
答案 2 :(得分:0)
我做错了什么?
你正在做出毫无根据的假设,关于应该的工作方式,你没有太多线索。你在这里处理两种根本不同的语言,只是因为你希望 WPF将Window.Test
解释为对你想到的某个特定窗口的引用并不是这样。
XAML基本上是基于字符串的,因为大多数字符串被转换为原始类型,如整数和双精度,例如设置控件的高度时,将string
传递给类型为double
的属性。 XAML解析器通过反射知道该属性的类型为double
,并尝试转换string
(如果没有指定其他属性,则使用默认的value converter)。现在,如果属性类型为object
,您认为会发生什么?什么是解析器?好吧,它不会做任何事情,因为string
已经已经 object
。
当你写Window.Test
时,猜猜Binding.Source
有什么类型以及绑定的源对象是什么......