2012-08-16 81 views
13

我想在我的XAML中绑定几个不同的属性:如何绑定到RelativeSource Self?

<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 Description} 

相反的:

{Binding Path=Description, ElementName=_UserInputOutput} 

似乎只用于的ElementName时要工作。我需要导出/导入这个XAML,所以我不能有一个ElementName或导入不起作用。

我想这将是最好的:

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

这没有奏效。

任何想法??谢谢!

+0

[本文](http://blogs.msdn.com/b/wpfsldesigner/archive/2010/06/30/debugging-data-bindings-in-a-wpf-or-silverlight-application.aspx)可能会感兴趣。 – 2012-08-16 23:01:50

回答

26

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

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

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

+0

你真了不起!!!!!!呜呼!有用! – 2012-08-16 21:32:12

+12

“这是什么RelativeSource是用来确定它相对于”该声明是明显不正确的。同时设置UserControl的DataContext也不是一个好主意...... – 2012-08-16 22:52:40

+2

我认为这不是一个好主意,因为它违反了MVVM范例:当我们想使用WPF和MVVM时,我们有一个视图绑定到它的ViewModel。因此,在View的构造函数后面,我们说'View(){InitializeComponent(); DataContext = new ViewModel(); }' 这使得所有的数据绑定操作都可以在ViewModel上工作,所以我们可以将视图从ViewModel中分离出来。 – codingdave 2016-09-15 11:57:33

29

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

没有绑定源(ElementNameSourceRelativeSource)在UserControls不过是相对于DataContext,你应该avoid setting the DataContext不与外部绑定一塌糊涂。

相关问题