【问题标题】:Displaying UserControls based on the type a TreeView selection is bound to根据 TreeView 选择绑定到的类型显示用户控件
【发布时间】:2010-04-08 01:00:39
【问题描述】:

我正在 WPF 中制作一个类似于 Windows 资源管理器的应用程序,左侧是 TreeView,右侧是窗格。

我希望右窗格的内容根据 TreeView 中所选元素的类型进行更改。

例如,假设树视图的顶层包含“A”类的对象,如果展开“A”对象,您将看到“B”对象列表作为“A”对象的子对象.

如果选择“A”对象,我希望右窗格显示“A”的用户控件,如果选择“B”,我希望右窗格显示“B”的用户控件。

我目前正在通过以下方式进行此工作:

  • 使用每种类型的一个 HierarchialDataTemplate 设置 TreeView
  • 将所有用户控件添加到右窗格,但已折叠
  • 在 TreeView 上实现 SelectedItemChanged,并将相应的用户控件设置为可见,将其他用户控件设置为折叠。

    但是,我确信有更好/更优雅的方法可以根据类型切换视图选择是必然的,也许是通过更多地使用数据绑定......有什么想法吗?

  • 【问题讨论】:

      标签: wpf


      【解决方案1】:

      您是否考虑过将 ContentControl 显示为右侧窗格,并使用 DataTemplates 自定义内容?然后您可以简单地将右窗格绑定到 TreeView 的选定项。

      例如:

      <ContentControl Content="{Binding SelectedItem,ElementName=treeView1}">
          <ContentControl.Resources>
              <DataTemplate DataType="{x:Type my:A}">
                  <StackPanel>
                      <TextBlock Text="Displaying an A!" />
                      <TextBlock Text="{Binding Foo}" />
                  </StackPanel>
              </DataTemplate>
      
              <DataTemplate DataType="{x:Type my:B}">
                  <StackPanel>
                      <TextBlock Text="Displaying a B!" />
                      <TextBlock Text="{Binding Bar}" />
                  </StackPanel>
              </DataTemplate>
          </ContentControl.Resources>
      </ContentControl>
      

      【讨论】:

      • 是的,这正是我在对 Josh 的评论中所指的内容。
      【解决方案2】:

      您可以将ContentPresenter 类与DataTemplateSelector 一起使用。将 Content 属性绑定到 TreeView.SelectedItem 属性,然后使用 DataTemplateSelector 有条件地选择模板。

      【讨论】:

      • 好方法。他还可以定义与每种类型的节点关联的数据模板(假设 A 节点与 B 节点的 clr 类型不同)
      • 是的,如果它严格基于类型并且您没有复杂的继承层次结构,这是一个不错的选择。如果您需要,DataTemplateSelector 确实为您提供了额外程度的控制。
      • 不确定您是否指的是 ContentTemplateSelector 而不是 DataTemplateSelector。不管怎样,我明白了,这对我很有帮助!
      猜你喜欢
      • 1970-01-01
      • 2014-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-28
      • 2010-11-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多