我是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。