我有一个包含 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}" >
答案 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}}"