我有一个具有模型对象树的应用程序,它构成了一种模式。这看起来可能是:
ElementSet
....ElementGroup
........ScalarElement
........BoolElement
....ElementGroup
........MatrixElement
........VectorElement这棵树要复杂得多,但你明白了。我将在WPF TreeView中显示此树,允许用户不仅选择特定节点(主细节样式),而且还可以添加、删除和重新排列节点。
我的目的是将树中的每个节点封装在一个ViewModel中,在这里我将添加命令、工具提示信息和其他与ViewModel相关的信息。
我的问题在于,我有一棵模型树,需要一棵ViewModels树才能与它一起使用。我正努力想出一个优雅的解决方案。我该怎么构造这个?让他们保持同步?等
我正在考虑的一个想法是直接将视图绑定到模型对象的图形上,但使用ValueConverter将模型转换为每个节点上的ViewModel。每个模型都有一个唯一的ID,因此让转换器维护一个可查询的ViewModels缓存以返回到视图并不是不可能的。
对于为集合/模型树创建视图模型,还有哪些其他有效的策略?
发布于 2013-10-24 06:58:46
最后,我使用了带有ValueConverter缓存的ViewModel。它实际上运作得很好。我这样设置我的TreeView:
<TreeView ItemsSource="{Binding TreeRoot}">
<TreeView.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding Children}">
<ContentPresenter Content="{Binding Converter={StaticResource ModelToViewModelConverter}}"/>
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>...where TreeRoot是模型对象树的根,每个对象都有一个属性“子”。并创建了这样的转换器:
public class ModelToViewModelConverter : IValueConverter
{
private static Dictionary<Guid, ViewModelBase> _map = new Dictionary<Guid, ViewModelBase>();
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
var element = value as ElementBase;
if (!_map.ContainsKey(element.Id))
{
if (element is ElementSet)_map.Add(element.Id, new ElementSetViewModel(value as ElementSet));
if (element is ElementGroup) _map.Add(element.Id, new ElementGroupViewModel(value as ElementGroup));
if (element is StringElement) _map.Add(element.Id, new StringElementViewModel(value as StringElement));
if (element is ScalarElement) _map.Add(element.Id, new ScalarElementViewModel(value as ScalarElement));
}
return _map[element.Id];
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
//A change.sdfsdfdsff
throw new NotImplementedException();
}
}这允许我只维护一个模型对象树,但允许我使用ViewModels来绑定视图。
发布于 2013-10-23 08:05:56
根据数据的复杂性,我建议为每个元素建立一个View模型,并推荐一个构造函数来递归地从您的模型构建一棵树。
如果您只想从模型中显示字符串和格式化的双倍,您甚至可能不需要视图模型,但从长远来看,它将使您的系统更加灵活。
https://stackoverflow.com/questions/19535847
复制相似问题