2

内部コントロールの ItemsSource プロパティにバインドする必要があるItemsSource DependenceProperty を含む UserControl があります。

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

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

controlName はコントロールの名前です。

最初のバインディングは機能しませんが、2 番目のバインディングは機能します。違いがわかりません。

何か案は?

編集:

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

あなたの質問から、次のような構造の Xaml があると仮定しています。

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

次に、バインディングは次のことを行います。

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

ItemsSource... これは、バインディングが宣言されているコントロール (つまり、 )のプロパティを探しますListBox。あなたの場合、本質的に無限再帰を設定しているため、これは問題を引き起こします。あなたItemsSourceはバインドさItemsSourceれています...無限にバインドされています。あなたはここで作業していると言いましたが、ルート要素を返すUserControlことを期待しているのではないかと思いますが、そうではありません。RelativeSourceUserControl

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

ItemsSource...これは、特定の名前でコントロールのプロパティにバインドします。で作業している場合UserControl、通常はx:Nameのルート要素を設定し、UserControlこの方法でバインディングから参照します。ListBoxこれにより、子を の publicItemsSourceプロパティにバインドできますUserControl

参考までに、別の方法として、AncestorTypeバインドを使用して親を見つける方法がありますUserControlUserControlタイプが と呼ばれる場合、次のMyControlようになります。

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

親 UserControl の DP にバインドする場合は、を使用してバインドする必要がありますMode = FindAncestor。内部統制にバインドしているため、ビジュアル ツリーを上に移動する必要があります。

Self Mode親 UserControl ではなく、内部コントロールで DP を検索します。

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