【问题标题】:Use different datatemplate by binding to different TreeView selectedItem通过绑定到不同的 TreeView selectedItem 来使用不同的数据模板
【发布时间】:2012-11-08 20:01:28
【问题描述】:

我已经构建了一个显示不同元素的 WPF MVVM TreeView。

基础元素
- CatA
-- 子项A
- 猫B
-- 子项目B

基于类,我想使用不同的数据模板。 每种类型。

到目前为止,我可以连接到选定的项目,但我不确定如何管理不同的数据模板。

public class SubItem
{
    public string Type { get; set; }
    public string Name { get; set; }
}


    <StackPanel Grid.Column="2" DataContext="{Binding ElementName=myTreeView, Path=SelectedItem}">
        <TextBox Text="{Binding Parent.Name}" />
        <TextBox Text="{Binding Path=Name, Mode=TwoWay}" />
    </StackPanel>

[11 月 15 日更新]

           <HierarchicalDataTemplate x:Key="L3Template" ItemsSource="{Binding L4Collection}" ItemTemplate="{StaticResource L4Template}">
                <StackPanel Orientation="Horizontal">
                    <TextBlock Text="{Binding Name}" />
                </StackPanel>
            </HierarchicalDataTemplate>

            <HierarchicalDataTemplate x:Key="CategoryTemplate" ItemsSource="{Binding L3Collection}" ItemTemplate="{StaticResource L3Template}">
                <StackPanel>
                    <TextBlock Text="{Binding Name}" />
                </StackPanel>
            </HierarchicalDataTemplate>

            <HierarchicalDataTemplate x:Key="L1Template" ItemsSource="{Binding CategoryCollection}" ItemTemplate="{StaticResource CategoryTemplate}">
                <StackPanel>
                    <TextBlock Text="{Binding Name}" />
                </StackPanel>
            </HierarchicalDataTemplate>

[/11 月 15 日更新]

【问题讨论】:

标签: c# wpf treeview selecteditem


【解决方案1】:

如果子项是不同的类,那么很简单:将每个类的数据模板添加到资源部分。 如果子项需要基于枚举属性值的不同模板,那么您将需要一个 datatemplateselector。这个比较麻烦。

【讨论】:

  • 谢谢。试图通过枚举道具的值来完成它,但数据模板选择器对我来说效果不佳。因此,我想重新编码一下以使用不同的类:在那种情况下(1)我需要一个父类和 observablecollection 的子类吗? (2) 如果我有不同的类,我将如何将 HirachicalDataTemplate 用于 TreeView 本身?
  • 不,您不需要可观察集合的子类。分层数据模板与普通数据模板几乎相同,它只是增加了在对象中指定属性以用于树视图项的子项的可能性。
  • 好的,我得到了这个 HierarchicalDataTemplate [11 月 15 日更新],它为所有级别构建了一个漂亮的树。如果 CatX 是一个具有不同名称的类,则 CatX 应该包含不同类的对象。我可以添加两个不同类的两个 observableCollections。但是我看不到我在 XAML/HierarchicalDataTemplate 中在哪里进行区分/切换,因为我可能只能执行一个 ItemTemplate="{StaticResource L3Template}" 语句?!
  • 啊,我明白你的意思了。在这种情况下,您无需设置 ItemTemplate,而是将数据模板添加到树视图 (f.i.) 的 de Resources 部分。您必须填写 TargetType 并且不使用任何键。 WPF 然后根据类类型应用模板。稍后我会添加一些示例代码。
  • 有了第二个答案,现在效果很好!我用 ContentPresenter 替换了 StackPanel,如下所示:stackoverflow.com/questions/1152128/… 然后效果很好。
【解决方案2】:

假设您将类命名为 L1Class、L3Class en Category 和 local 指向这些类的命名空间:

    <TreeView ...>
        <TreeView.Resources>
                <HierarchicalDataTemplate DataType="{x:Type local:L3Class}" ItemsSource="{Binding L4Collection}" >
                    <StackPanel Orientation="Horizontal">
                        <TextBlock Text="{Binding Name}" />
                    </StackPanel>
                </HierarchicalDataTemplate>

                <HierarchicalDataTemplate DataType="{x:Type local:Category}" ItemsSource="{Binding L3Collection}" >
                    <StackPanel>
                        <TextBlock Text="{Binding Name}" />
                    </StackPanel>
                </HierarchicalDataTemplate>

                <HierarchicalDataTemplate DataType="{x:Type local:L1Class}" ItemsSource="{Binding CategoryCollection}" >
                    <StackPanel>
                        <TextBlock Text="{Binding Name}" />
                    </StackPanel>
                </HierarchicalDataTemplate>
            </TreeView.Resources>
    </TreeView>

注意资源部分中隐式数据模板的使用(没有键,但是 DataType!)。

【讨论】:

  • 太棒了!效果很好。您实际上揭示了 TreeViews 和 HirachicalDataTemplates 的奥秘!非常感谢。我将它连接到我的 ViewModel,例如 DataType="{x:Type local:CategoryViewModel}"。并添加了本地语句 xmlns:local="clr-namespace:MyApplication.ViewModel"。然后效果很好。
【解决方案3】:

以防万一它会帮助别人:

        <ContentPresenter Grid.Column="2" Content="{Binding ElementName=myTreeView, Path=SelectedItem}">
            <ContentPresenter.Resources>
                <DataTemplate DataType="{x:Type local:L1ViewModel}">
                    <StackPanel>
                        <TextBlock Text="{Binding Name}" />
                    </StackPanel>
                </DataTemplate>
                <DataTemplate DataType="{x:Type local:CategoryViewModel}">
                    <StackPanel>
                        <TextBlock Text="{Binding Name}" />
                    </StackPanel>
                </DataTemplate>

                <DataTemplate DataType="{x:Type local:L3ViewModel}">
                    <StackPanel>
                        <TextBlock Text="{Binding Name}" />
                    </StackPanel>
                </DataTemplate>

                <DataTemplate DataType="{x:Type local:L4ViewModel}">
                    <StackPanel>
                         <TextBox Text="{Binding Parent.Name}" />
                        <TextBlock Text="{Binding Name}" />
                    </StackPanel>
                </DataTemplate>
            </ContentPresenter.Resources>
          </ContentPresenter>

【讨论】:

    猜你喜欢
    • 2011-09-12
    • 1970-01-01
    • 2010-12-15
    • 1970-01-01
    • 2013-08-16
    • 2022-01-06
    • 1970-01-01
    • 1970-01-01
    • 2011-07-21
    相关资源
    最近更新 更多