WPF绑定到UserControl的DependencyProperty无法按预期工作

时间:2016-11-01 20:06:34

标签: c# wpf xaml user-controls dependency-properties

我对DependecyProperty绑定有一些奇怪的问题。 为了使问题更简单,我创建了一些虚拟控件,它具有相同的不需要的行为

我有一个UserControl,它在后面的代码中定义了DependencyProperty:

public static readonly DependencyProperty TestValueProperty = DependencyProperty.Register("TestValue", typeof(string), typeof(Test), new PropertyMetadata(default(string)));

public string TestValue
{    
     get { return (string)GetValue(TestValueProperty); }
     set { SetValue(TestValueProperty, value); }
}

此属性用于XAML:

<Label Content="{Binding TestValue}" />

此控件应该在另一个控件中使用,如下所示:

<views:Test TestValue="{Binding Settings.Setting123}" />

Settings在viewmodel中定义为property。

Settings.Setting123的内容在我的usercontrol标签中不可见。

当编写一些修复值而不是绑定时,它可以正常工作:

<views:Test TestValue="Test" />

但当然我不想要固定值,而是绑定对象的内容。 有什么提示这里出了什么问题?

提前致谢!

1 个答案:

答案 0 :(得分:0)

你没有为任何人分享足够的代码来重新创建问题,但是在行之间阅读,我猜你Label XAML中有UserControl。如果TestValueUserControl的属性,则可能会有效:

<Label Content="{Binding TestValue, RelativeSource={RelativeSource AncestorType=UserControl}}" />

然而,你可能已经做过的一个原因(并且使用文字字符串进行半工作)就是你使UserControl成为自己的DataContext。在这种情况下,然后问题是您已将UserControl设为自己的DataContext 。如果您这样做,那么绑定的Binding上的UserControl将在Settings.Setting123的上下文中进行评估,DataContext没有Binding属性。

控件Binding的含义是,当您在某个控件属性上或其XAML 中有UserControl时,DataContext就是{RelativeSource AncestorType=UserControl}去寻找你绑定的属性。你明确告诉它要错误的地方。

如果您将UserControl设为自己的{{1}},则无法绑定任何内容。这就是你不应该这样做的原因。就像其中一台机器什么都不做,只能从墙上拔掉它自己。相反,在{{1}} XAML中使用上面的{{1}}绑定。

我不应该猜。您声称您创建了一个最小的可验证示例,但没有打扰共享它。如果您分享,我们可以放心地解决您的问题。