这两种声明自我约束的方式有什么区别?

时间:2012-11-14 12:00:02

标签: c# .net wpf binding

我有一个包含 ItemsSource DependenceProperty的UserControl,必须绑定到内部控件的ItemsSource属性:

ItemsSource="{Binding ItemsSource, RelativeSource={RelativeSource Self}}"

VS

ItemsSource="{Binding ItemsSource, ElementName=controlName}"

controlName是控件的名称。

第一个绑定无效,而第二个绑定无效。我没有区别。

有什么想法吗?

修改

XAML:

<UserControl x:Class="MultiSelectTreeView.MultiSelectableTreeView"

         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 

         mc:Ignorable="d"

         Name="multiTree" >

This does not work ---> <TreeView ItemsSource="{Binding ItemsSource, RelativeSource={RelativeSource Self}}" >
This works ---> <TreeView ItemsSource="{Binding ItemsSource, ElementName=multiTree}" >

2 个答案:

答案 0 :(得分:1)

如果要绑定到父UserControl的DP,则需要使用Mode = FindAncestor绑定它。由于您对内部控制具有约束力,因此您需要向上移动Visual Tree。

Self Mode将在内部控制中搜索DP,而不是在父UserControl上搜索。

ItemsSource="{Binding ItemsSource, RelativeSource={RelativeSource FindAncestor, 
                                                   AncestorType=UserControl}}"

答案 1 :(得分:1)

我从你的问题中假设你在结构中有这样的Xaml:

<UserControl x:Name="rootElement">
    <ListBox ItemsSource="{Binding .....}" />
</UserControl>

您的绑定正在执行以下操作:

ItemsSource="{Binding ItemsSource, RelativeSource={RelativeSource Self}}"

...这将在控件上查找声明绑定的属性ItemsSource(即ListBox)。在您的情况下,这将导致问题,因为您实际上是在设置无限递归:您的ItemsSource绑定到ItemsSource绑定到无限广告。你提到你在这里使用UserControl,我怀疑你可能期望RelativeSource返回根UserControl元素 - 但事实并非如此。

ItemsSource="{Binding ItemsSource, ElementName=rootElement}"

...这将绑定到具有特定名称的控件上的属性ItemsSource。如果您正在使用UserControl,那么通常您会在x:Name的根元素上设置UserControl,并以这种方式从绑定中引用它。这样您就可以将子ListBox绑定到ItemsSource的公开UserControl属性。

仅供参考,另一种方法是使用AncestorType绑定来查找您的父UserControl。如果您的UserControl类型被称为MyControl,则它看起来像这样:

ItemsSource="{Binding ItemsSource, RelativeSource={RelativeSource FindAncestor, AncestorType=MyControl}}"