如何绑定到RelativeSource Self?

时间:2012-08-16 20:57:46

标签: wpf binding

我正在尝试在我的Xaml中绑定几个不同的属性:

<Label Content="{Binding Description}" 
Visibility="{Binding Path=DescriptionVisibility, 
ElementName=_UserInputOutput}"               
FontSize="{Binding Path=FontSizeValue, ElementName=_UserInputOutput}"  
HorizontalAlignment="Left" VerticalAlignment="Top" Padding="0" />

你会注意到我在这里使用了两种不同的绑定技术。使用元素名称的工作,另一个不工作。这是背后的代码:

public string Description
{
     get { return (string)GetValue(DescriptionProperty); }
     set { SetValue(DescriptionProperty, value); }
}
public static readonly DependencyProperty DescriptionProperty = 
DependencyProperty.Register("Description", typeof(string), typeof(UserControl), 
new UIPropertyMetadata(""));

每个Binding都有不同的名称,但大多数都看起来像这样。 我希望我的Binding能够使用:

{Binding Description}

而不是:

{Binding Path=Description, ElementName=_UserInputOutput}

使用ElementName时似乎只能工作。我需要导出/导入这个XAML,所以我不能拥有ElementName,否则导入将无效。

我认为这是最好的:

{Binding Path=Description, RelativeSource={RelativeSource Self}}

这不起作用。

任何想法?谢谢!

2 个答案:

答案 0 :(得分:32)

{RelativeSource Self}定位拥有绑定属性的对象,如果你对Label有这样的绑定,它会查找Label.Description,而不是{RelativeSource AncestorType=UserControl}。相反,您应该使用ElementName

没有来源的约束(SourceRelativeSourceDataContext)与UserControls相关,但在{{1}}中您应该avoid setting the DataContext不要混淆外部绑定。

答案 1 :(得分:29)

您尚未设置DataContext,这是RelativeSource用来确定它相对于什么的。您需要将DataContext设置在更高级别,如UserControl。我通常有:

<UserControl ... DataContext="{Binding RelativeSource={RelativeSource Self}}">
</UserControl>

这告诉UserControl将自己绑定到代码隐藏中的类。