1

我有一个 TreeView,其内容(嵌套的 TreeViewItems)是通过数据绑定从数据集生成的,这一切似乎都工作正常。我遇到的问题是,当我尝试在代码中操作 TreeViewItem 标头的内容时,Header 属性返回生成 TreeViewItem 的 DataRowView,而不是像我预期的那样由模板生成的控件。

这是我用来生成 TreeViewItems 的模板示例:

    <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)?

谢谢,詹姆斯

4

1 回答 1

1

好吧,经过一番搜索,我找到了解决问题的适当方法。

使用以下代码,您可以在模板中找到命名项目:

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 和 ItemTemplate 属性将允许您绑定和格式化子树子树,例如:

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

我希望其他人会发现此信息有用。

于 2010-10-25T12:33:58.293 回答