使用MVVM实现TreeView

时间:2014-05-19 14:53:03

标签: c# wpf mvvm

我是MVVM模式的新手,我有一个实现TreeView的任务,它就像一个工作空间查看器(有点像eclipse的/ vs的解决方案资源管理器)。 树视图可以包含多种类型的项(如文件,其他项的文件夹等)。 我创建了模型(文件夹的模型有子项(可以是任何类型的项目),名称等)。

示范模型:

public class SystemFolder: IWorkspaceItem
{
    string mTitle;

    public ObservableCollection<IWorkspaceItem> Children { get; set; }

    public string Path
    {
        get { return mTitle; }
        set
        {
            mTitle = value;
            OnPropertyChanged("Title");
        }
    }

    //Constructor
    public SystemFolder(string name, ItemType type, string path)
        : base(name, type)
    {
        Path = path;
        Children = new ObservableCollection<IWorkspaceItem>();

        //add children here...
    }
    //Some more code here..
}

我为每个模型创建了一个ViewModel(它们都存储了模型的实例)。 ViewModel具有视图所需的必要属性(如Title,Children等)。

示例ViewModel:

public class SystemFolderViewModel : TreeViewModelItem
{
    SystemFolder mFolder;
    ObservableCollection<TreeViewModelItem> mChildren;
    public ObservableCollection<TreeViewModelItem> Children
    {
        get { return mChildren; }
    }

    //====================
    // Constructor
    //====================
    public SystemFolderViewModel(SystemFolder folder, TreeViewModelItem parentWorkspaceItem)
        : base(parentWorkspaceItem)
    {
        mFolder = folder;

        mFolder.Attach(OnItemPropertyChanged);
    }

    public string Name
    {
        get { return mFolder.Name; }
        set { Name = value; }
    }

    public string IconPath
    {
        get { return mFolder.ItemType.IconPath; }
        set { IconPath = value; }
    }
    //Some more code here..
}

我还实现了View,它定义了每个ViewModel的HierarchicalDataTemplate。 这一切都很好,我实际上做了一个模型。

视图中的HierarchicalDataTemplate示例:

<HierarchicalDataTemplate
    DataType="{x:Type local:SystemFolderViewModel}"
    ItemsSource="{Binding Children}">
            <StackPanel Orientation="Horizontal">
            <Image Width="16" Height="16" Margin="3,0" Source="{Binding Path=IconPath}"/>
                <TextBlock Text="{Binding Name}"/>
            </StackPanel>
</HierarchicalDataTemplate>

整个初始化:

Workspace data_model = new Workspace("Main Workspace", PredefinedTypes.GetWorkspaceType(), Database.GetItems());
        TreeViewModel vm = new TreeViewModel(data_model);
        WorkspaceView viewer = new WorkspaceView(vm);
//add to grid etc..

现在我的问题是我的程序是动态的。意思是,项目可以在运行时添加到TreeView中。 现在让我解释一下我是如何理解MVVM应该工作的,请纠正我。 数据模型为视图提供项目。 所以我的程序应该只添加项目到数据模型。 树的主ViewModel包含一个DataModel实例,用于保存工作区的主要子项。

添加到模型中的每个项目都应自动更新ViewModel,ViewModel应该更新视图。 由于我只更新DataModel,当我将一个子项添加到其中一个项目时,ViewModel应该在ViewModel中找到相应的项目并向其添加一个新子项。 为什么我必须有两个单独的收藏? DataModel的Children和ViewModel Children。

我需要从INotifyPropertyChanged继承每个数据模型,以便更新其ViewModel。 正如我所说,有些数据模型有自己的孩子。如果该集合发生更改,我需要更改项目的ViewModel中的集合。 这一切对我来说都是愚蠢的。我为什么要解决所有这些麻烦?为什么我不能只将项目添加到将更新视图的ViewModel? 我错过了什么? 我该如何解决这个问题?

如果您需要更多信息,请询问我,我会提供/解释。

谢谢! 的Dolev。

0 个答案:

没有答案