2

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

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

对比

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}" >
4

2 回答 2

1

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

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

ItemsSource="{Binding ItemsSource, RelativeSource={RelativeSource FindAncestor, 
                                                   AncestorType=UserControl}}"
于 2012-11-14T12:12:27.250 回答
1

我从您的问题中假设您的 Xaml 在结构上是这样的:

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

然后您的绑定将执行以下操作:

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

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

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

...这将绑定到ItemsSource具有特定名称的控件上的属性。如果您在 a 中工作,UserControl那么通常您会x:Name在 the 的根元素上进行设置,UserControl并以这种方式从绑定中引用它。这将允许您将孩子绑定ListBoxItemsSource您的UserControl.

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

ItemsSource="{Binding ItemsSource, RelativeSource={RelativeSource FindAncestor, AncestorType=MyControl}}"
于 2012-11-14T12:16:34.037 回答