【问题标题】:WPF Treeview single objects as child nodesWPF Treeview 单个对象作为子节点
【发布时间】:2017-12-08 12:13:45
【问题描述】:

我不太确定在我的情况下是否应该使用 TreeView,但这似乎是一个合乎逻辑的选择。我正在尝试创建一个由 ObjectA 列表填充的 TreeView。

ObjectA 如下所示:

public class ObjectA{
    public string DisplayName { get; set; }
    public ObjectB CurrentChild { get; set; }
    public ObjectB PreviousChild { get; set; }
}

如您所见,ObjectA 包含 ObjectB 的两个子代。一个是当前孩子,第二个是前一个孩子。

ObjectB 看起来像这样:

public class ObjectB{
    public string DisplayName { get; set; }
}

如何创建一个显示 ObjectA 的“DisplayName”的 TreeView,如果展开 ObjectA,您可以看到两个子节点,一个是 CurrentChild,另一个是 PreviousChild?我知道我可以创建一个 ObjectB 的列表作为 ObjectA 的属性并将 CurrentChild 和 PreviousChild 存储在此列表中,而不是使用两个属性,并且使用这样的列表我可以使用“HierarchicalDataTemplate”做一些简单的事情,但我想知道它是否可以创建一个 TreeView 或另一个 WPF 控件,这些控件可以显示这些对象,而无需更改实际的“后端”代码。我会很感激你的帮助:)

【问题讨论】:

  • 根据您如何定义“扩展 ObjectA”,您可能会使用 ListBox 并在选择 ListBoxItem 时显示两个子项(通过其 IsSelected 属性上的触发器)。

标签: c# wpf xaml treeview


【解决方案1】:

如果你真的不想改变你的对象模型,你也可以选择HierarchicalDataTemplate,并使用一个转换器来绑定对象:

<TreeView ItemsSource="{Binding CollectionAObjects}">
  <TreeView.Resources>
    <HierarchicalDataTemplate ItemsSource="{Binding, Converter={StaticResource MyCollectionConverter}}" ...>

转换器类应该很简单,例如...

public class MyCollectionConverter: IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        var result = new ObservableCollection<ObjectB>();
        result.Add(((ObjectA)value).CurrentChild);
        result.Add(((ObjectA)value).PreviousChild );
        return result;
   }

   public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
   {
       throw new NotImplementedException();
   }
}

不要忘记声明转换器的命名空间(如果它与 WPF 视图类不同)并将其添加到本地资源中:

<Window.Resources>
   <local:MyCollectionConverter x:Key="MyCollectionConverter" />
</Window.Resources>

【讨论】:

  • 请注意,从转换器返回 ObservableCollection 是没有意义的。永远不会添加或删除任何项目,因此通知它是没有意义的。您可以简单地返回new ObjectB[] { a.CurrentChild, a.PreviousChild }
  • 是的。而且如果他不编辑原始模型,他也不会以任何方式通知子对象的更改。谢谢@Clemens!
  • 我的模型实际上是不同的,我只是组成了 ObjectA 和 ObjectB,因为它们代表了我想要完成的事情,而没有对问题不重要的东西,所以 ObservableCollection 是完美的。答案正是我想要的,谢谢!
  • 除了一件小事,我不得不修改转换器,因此它会检查值对象是否为 ObjectB,因为每当我在树视图中展开项目时,它总是如此。
  • 好点,我忘记了...但我想这提供了一个大致的思路,如果有人在未来需要这些信息,需要做什么
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-14
  • 1970-01-01
  • 1970-01-01
  • 2014-04-20
相关资源
最近更新 更多