23

我试图在我的 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 Description}

代替:

{Binding Path=Description, ElementName=_UserInputOutput}

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

我认为这是最好的:

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

这没有用。

有任何想法吗??谢谢!

4

2 回答 2

38

{RelativeSource Self}以拥有正在绑定的属性的对象为目标,如果您在 a 上有这样的绑定,Label它将查找Label.Description不存在的 。相反,您应该使用{RelativeSource AncestorType=UserControl}.

没有源 ( ElementName, Source, RelativeSource) 的绑定是相对于 的DataContext,但是在UserControls您应该避免将 设置DataContext为不与外部绑定混淆。

于 2012-08-16T22:57:21.357 回答
32

您还没有设置 DataContext,RelativeSource 使用它来确定它的相对对象。您需要在更高级别设置 DataContext,例如 UserControl。我通常有:

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

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

于 2012-08-16T21:09:16.583 回答