WPF Treeview单个对象作为子节点

时间:2017-12-08 12:13:45

标签: c# wpf xaml treeview

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

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控件,它可以显示这些对象而不改变实际的“后端” - 代码。非常感谢你的帮助:)。

1 个答案:

答案 0 :(得分:2)

如果你真的不想改变你的对象模型,你也可以去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 View类不同)并将其添加到本地资源中:

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