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