質問

データバインディングを介してデータセットからコンテンツ(ネストされたTreeViewItems)が生成されるTreeViewがありますが、これはすべて正常に動作しているようです。私が遭遇している問題は、コードで TreeViewItem ヘッダーの内容を操作しようとすると、Header プロパティが、期待していたテンプレートによって生成されたコントロールではなく、TreeViewItem の生成元の DataRowView を返すことです。

TreeViewItem の生成に使用しているテンプレートの例を次に示します。

    <DataTemplate x:Key="seasonTreeViewItemTemplate">
        <TreeViewItem>
            <TreeViewItem.Header>
                <CheckBox Content="{Binding Path=Row.SeasonID}" Tag="{Binding}" ToolTip="{Binding Path=Row.Title}" IsEnabled="{StaticResource seasonPermitted}" Checked="CheckBox_Checked" Unchecked="CheckBox_Unchecked" />
            </TreeViewItem.Header>

            <TreeViewItem Header="Championships" ItemTemplate="{StaticResource championshipTreeViewItemTemplate}">
                <TreeViewItem.ItemsSource>
                    <Binding Path="Row" ConverterParameter="FK_Championship_Season">
                        <Binding.Converter>
                            <local:RowChildrenConverter />
                        </Binding.Converter>
                    </Binding>
                </TreeViewItem.ItemsSource>
            </TreeViewItem>
        </TreeViewItem>
    </DataTemplate>

誰かが私が間違っているところを指摘し、ヘッダーチェックボックスにアクセスする方法を教えてもらえますか(できればVisualTreeを詳しく調べずに)。

ありがとう、ジェームズ

役に立ちましたか?

解決

さて、いくつか検索した結果、問題に対する適切な解決策が見つかりました。

次のコードを使用すると、テンプレート内の名前付き項目を見つけることができます。

if (treeViewItem != null)
{
        //Get the header content presenter.
        ContentPresenter header = treeViewItem.Template.FindName("PART_Header", treeViewItem) as ContentPresenter;

        if (header != null)
        {
            //Find a CheckBox called "checkBoxName"
            CheckBox cb = treeViewItem.HeaderTemplate.FindName("checkBoxName", header) as CheckBox;
        }
} 

また、データバインディング ツリービューについてあまり詳しくない人のために、次のようにします。質問に投稿したテンプレートは、ツリービューをバインドする正しい方法ではありません。ツリーの各レベルに HierarchicalDataTemplate を使用します。HierarchicalDataTemplate の直接コンテンツは各サブツリーのヘッダー コンテンツを指定し、ItemsSource プロパティと ItemsTemplate プロパティを設定すると、サブツリーの子をバインドして書式設定できるようになります。次に例を示します。

<HierarchicalDataTemplate x:Key="templateName" ItemsSource="{Binding Path=someCollection}" ItemTemplate="{StaticResource someOtherTemplate}">
    <TextBlock Text="{Binding Path=SomeProperty}" />
</HierarchicalDataTemplate>

他の誰かがこの情報を役立つことを願っています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top