WPF TreeView - 混淆子节点的数据绑定和样式

时间:2015-03-18 09:58:03

标签: c# wpf xaml mvvm treeview

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

我的ViewModel包含一个具有以下层次结构的对象:

- 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代码的不同方法。但主要问题是描述子节点绑定到其父节点的依赖关系,因此它们在运行时保持为空。

你可以帮帮我吗?

谢谢。

2 个答案:

答案 0 :(得分:0)

在我看来,您可以使用隐式DataTemplate机制(看看here到DataType属性)。通过这种方式,您可以定义更多DataTemplates,其中每一个都是&#34;链接&#34;特定的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创建自己的逻辑,为您选择正确的模板。

答案 1 :(得分:0)

嗯,不知何故,我实现了为根节点和子节点提供不同的设计。这是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>

接下来的问题是我无法在运行时访问Checkboxes。 WPF吓坏了我:/

编辑:

等待..实际上通过将复选框更改为以下XAML代码非常简单:

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