【发布时间】:2017-03-04 05:03:17
【问题描述】:
我正在尝试(但失败)对 xaml 中的依赖属性进行数据绑定。当我在后面使用代码时它工作得很好,但在 xaml 中却不行。
用户控件只是一个绑定到依赖属性的TextBlock:
<UserControl x:Class="WpfTest.MyControl" [...]>
<TextBlock Text="{Binding Test}" />
</UserControl>
并且依赖属性是一个简单的字符串:
public static readonly DependencyProperty TestProperty
= DependencyProperty.Register("Test", typeof(string), typeof(MyControl), new PropertyMetadata("DEFAULT"));
public string Test
{
get { return (string)GetValue(TestProperty); }
set { SetValue(TestProperty, value); }
}
我有一个常规属性,在主窗口中通常实现INotifyPropertyChanged。
private string _myText = "default";
public string MyText
{
get { return _myText; }
set { _myText = value; NotifyPropertyChanged(); }
}
到目前为止一切顺利。如果我将此属性绑定到主窗口上的TextBlock,一切正常。如果 MyText 发生变化,文本会正确更新,并且一切正常。
<TextBlock Text="{Binding MyText}" />
但是,如果我在我的用户控件上做同样的事情,什么都不会发生。
<local:MyControl x:Name="TheControl" Test="{Binding MyText}" />
现在有趣的是,如果我在后面的代码中执行相同的绑定,它就可以工作!
TheControl.SetBinding(MyControl.TestProperty, new Binding
{
Source = DataContext,
Path = new PropertyPath("MyText"),
Mode = BindingMode.TwoWay
});
为什么它在 xaml 中不起作用?
【问题讨论】:
-
显示更多 XAML。我怀疑如果你绑定到 {Binding},你会发现你绑定到了错误的数据上下文。
-
您应该将属性名称(“Test”)作为第一个参数传递给 Register 方法。我找不到接收 Type 作为第一个参数的重载。
-
MyControl 的 DataContext 是什么?它应该是主窗口
-
如果数据上下文错误,它也无法与解决方案背后的代码一起使用。
DataContext在两个构造函数(窗口和用户控件)中都设置为this。 -
是的,我已经尝试过
RegisterAttached。不幸的是,它也不起作用。
标签: c# wpf xaml data-binding dependency-properties