首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有模型树的MVVM

具有模型树的MVVM
EN

Stack Overflow用户
提问于 2013-10-23 07:50:03
回答 2查看 829关注 0票数 2

我有一个具有模型对象树的应用程序,它构成了一种模式。这看起来可能是:

代码语言:javascript
复制
ElementSet
....ElementGroup
........ScalarElement
........BoolElement
....ElementGroup
........MatrixElement
........VectorElement

这棵树要复杂得多,但你明白了。我将在WPF TreeView中显示此树,允许用户不仅选择特定节点(主细节样式),而且还可以添加、删除和重新排列节点。

我的目的是将树中的每个节点封装在一个ViewModel中,在这里我将添加命令、工具提示信息和其他与ViewModel相关的信息。

我的问题在于,我有一棵模型树,需要一棵ViewModels树才能与它一起使用。我正努力想出一个优雅的解决方案。我该怎么构造这个?让他们保持同步?等

我正在考虑的一个想法是直接将视图绑定到模型对象的图形上,但使用ValueConverter将模型转换为每个节点上的ViewModel。每个模型都有一个唯一的ID,因此让转换器维护一个可查询的ViewModels缓存以返回到视图并不是不可能的。

对于为集合/模型树创建视图模型,还有哪些其他有效的策略?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-10-24 06:58:46

最后,我使用了带有ValueConverter缓存的ViewModel。它实际上运作得很好。我这样设置我的TreeView:

代码语言:javascript
复制
<TreeView ItemsSource="{Binding TreeRoot}">
    <TreeView.ItemTemplate>
        <HierarchicalDataTemplate ItemsSource="{Binding Children}">
            <ContentPresenter Content="{Binding Converter={StaticResource ModelToViewModelConverter}}"/>
        </HierarchicalDataTemplate>
    </TreeView.ItemTemplate>
</TreeView>

...where TreeRoot是模型对象树的根,每个对象都有一个属性“子”。并创建了这样的转换器:

代码语言:javascript
复制
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来绑定视图。

票数 1
EN

Stack Overflow用户

发布于 2013-10-23 08:05:56

根据数据的复杂性,我建议为每个元素建立一个View模型,并推荐一个构造函数来递归地从您的模型构建一棵树。

如果您只想从模型中显示字符串和格式化的双倍,您甚至可能不需要视图模型,但从长远来看,它将使您的系统更加灵活。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19535847

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档