我正在尝试在我的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}}
这不起作用。
任何想法?谢谢!
答案 0 :(得分:32)
{RelativeSource Self}
定位拥有绑定属性的对象,如果你对Label
有这样的绑定,它会查找Label.Description
,而不是{RelativeSource AncestorType=UserControl}
。相反,您应该使用ElementName
。
没有来源的约束(Source
,RelativeSource
,DataContext
)与UserControls
相关,但在{{1}}中您应该avoid setting the DataContext
不要混淆外部绑定。
答案 1 :(得分:29)
您尚未设置DataContext,这是RelativeSource用来确定它相对于什么的。您需要将DataContext设置在更高级别,如UserControl。我通常有:
<UserControl ... DataContext="{Binding RelativeSource={RelativeSource Self}}">
</UserControl>
这告诉UserControl将自己绑定到代码隐藏中的类。