WPF 树视图 - 混淆子节点的数据绑定和样式



我对 TreeView 的 WPF 数据绑定和样式声明感到困惑,尤其是对于子节点。

我的视图模型包含具有以下层次结构的对象:

- Component1
  - SubcomponentA
  - SubcomponentB
- Component2
  - SubcomponentX
  - SubcomponentY
  - SubcomponentZ

我想修改 XAML 文件,这样我就不必在.cs文件中执行任何操作。

这段代码实际上有效:

<TreeView Name="tvComponent" ItemsSource="{Binding BpModule.BpComponentPrototypes.Elements}">
    <TreeView.ItemTemplate>
        <HierarchicalDataTemplate ItemsSource="{Binding BpSubcomponents.Elements}">
            <StackPanel Orientation="Horizontal">
                <CheckBox Name="cb_run"></CheckBox>
                <TextBlock Text="{Binding ShortName}" />
            </StackPanel>
        </HierarchicalDataTemplate>
     </TreeView.ItemTemplate>
 </TreeView>

但是,我想为根节点和子节点创建不同的样式。我使用几乎完全不同的 XAML 代码尝试了不同的方法。但主要问题是描述子节点与其父节点绑定的依赖关系,因此它们在运行时保持为空。

你能帮我吗?

谢谢。

在我看来

,您可以使用隐式DataTemplate机制(查看此处的数据类型属性(。通过这种方式,您可以定义 更多 DataTemplates ,它们中的每一个都"链接"到特定的Type

<TreeView Name="tvComponent" ItemsSource="{Binding BpModule.BpComponentPrototypes.Elements}">
    <TreeView.Resources>
        <HierarchicalDataTemplate DataType="{x:Type local:RootType}"ItemsSource="{Binding ...}">
            ...
        </HierarchicalDataTemplate>
        <HierarchicalDataTemplate DataType="{x:Type local:ComponentType}" ItemsSource="{Binding BpSubcomponents.Elements}">
            <StackPanel Orientation="Horizontal">
                <CheckBox Name="cb_run"></CheckBox>
                <TextBlock Text="{Binding ShortName}" />
            </StackPanel>
        </HierarchicalDataTemplate>
        <DataTemplate DataType="{x:Type local:SubcomponentType}">
            ...
        </DataTemplate>
    </TreeView.Resources>
</TreeView>

否则,您始终可以使用 DataTemplateSelector 来创建自己的逻辑,从而为您选择正确的模板。

好吧,不知何故,我实现了为根节点和子节点提供不同的设计。下面是 XAML 代码:

<TreeView Name="tvSoftwareComponentPrototypes" ItemsSource="{Binding Path=BpModule.BpComponentPrototypes.Elements}">
            <TreeView.ItemTemplate>
                <HierarchicalDataTemplate ItemsSource="{Binding BpSubcomponents.Elements}">
                    <HierarchicalDataTemplate.ItemTemplate>
                        <DataTemplate>
                            <StackPanel Orientation="Horizontal">
                                <CheckBox Name="cb_run"></CheckBox>
                                <Image Source="/Resources/SubComponent.png" Margin="5,0,3,0" />
                                <TextBlock Text="{Binding ShortName}" />
                            </StackPanel>
                        </DataTemplate>
                    </HierarchicalDataTemplate.ItemTemplate>
                        <StackPanel Orientation="Horizontal">
                            <CheckBox Name="cb_swc" Checked="cb_swc_Checked" Unchecked="cb_swc_Unchecked"></CheckBox>
                            <Image Source="/Resources/Component.png" Margin="5,0,3,0" />
                            <TextBlock Text="{Binding ShortName}" />
                        </StackPanel>
                    </HierarchicalDataTemplate>
                </TreeView.ItemTemplate>
            </TreeView>

下一个问题是我无法在运行时访问复选框。WPF吓坏了我:/

编辑:

等等..实际上,通过将复选框更改为以下XAML代码,这很容易:

 <CheckBox Name="cb_swc" IsChecked="{Binding Path=PropertyName, Mode=TwoWay}"/>

最新更新