2013-02-04 39 views
2

是真的,如果我创建一个ViewModel我需要在MVVM模式中为它创建模型?是真的,如果我创建一个ViewModel我需要在MVVM模式中为它创建模型?

例如我的任务是在窗口顶部的WPF应用程序中创建简单的菜单。

这是我的看法MainWindow.xaml

<Window x:Class="AppMvvm.View.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:vm="clr-namespace:AppMvvm.ViewModel" 
    Title="{Binding DisplayName}" Height="350" Width="525" 
    WindowStartupLocation="CenterScreen"> 

<Window.Resources> 
    <Style x:Key="MenuItemStyle"> 
     <Setter Property="MenuItem.Command" Value="{Binding Command}" /> 
    </Style> 
    <HierarchicalDataTemplate DataType="{x:Type vm:MenuItemViewModel}" 
           ItemsSource="{Binding Children}"> 
     <ContentPresenter Content="{Binding DisplayName}" /> 
    </HierarchicalDataTemplate> 
</Window.Resources> 

<DockPanel> 
    <DockPanel DockPanel.Dock="Top"> 
     <Menu ItemsSource="{Binding MenuItems}" ItemContainerStyle="{StaticResource MenuItemStyle}"/> 
    </DockPanel> 


</DockPanel> 
</Window> 

这里是我的视图模型MenuItemViewModel.cs

namespace AppMvvm.ViewModel 
{ 
    public class MenuItemViewModel : ViewModelBase 
    { 

     public MenuItemViewModel(string menuItemName, IList<MenuItemViewModel> children) 
     { 
      base.DisplayName = menuItemName; 
      this.Children = children; 
     } 

     public MenuItemViewModel(string menuItemName) 
      : this (menuItemName, children: null) 
     { 
     } 

     public MenuItemViewModel(string menuItemName, ICommand command) 
     { 
      base.DisplayName = menuItemName; 
      this.Command = command; 
     } 

     public IList<MenuItemViewModel> Children { get; private set; } 

     public ICommand Command { get; private set; } 
    } 
} 

我班WorkspaceViewModel.cs是基类为MainWindowViewModel.cs这是绑定到视图

namespace AppMvvm.ViewModel 
{ 
    using Helpers; 

    public abstract class WorkspaceViewModel : ViewModelBase 
    { 
     #region Fields 
     private IList<MenuItemViewModel> _menuItems; 
     private RelayCommand _closeCommand; 
     #endregion 

     #region MenuItems 
     public IList<MenuItemViewModel> MenuItems 
     { 
      get 
      { 
       if (_menuItems == null) 
        _menuItems = CreateMenuItems(); 
       return _menuItems; 
      } 
     } 

     List<MenuItemViewModel> CreateMenuItems() 
     { 
      return new List<MenuItemViewModel> 
       { 
        new MenuItemViewModel("File", CreateFileMenuItems()), 
        new MenuItemViewModel("Tools"), 
        new MenuItemViewModel("About") 
       }; 
     } 

     #region CreateFileMenuItems & Commands 
     List<MenuItemViewModel> CreateFileMenuItems() 
     { 
      return new List<MenuItemViewModel> 
       { 
        new MenuItemViewModel("New"), 
        new MenuItemViewModel("Exit", CloseCommand) 
       }; 
     } 

     public ICommand CloseCommand 
     { 
      get 
      { 
       if (_closeCommand == null) 
        _closeCommand = new RelayCommand(p => Close()); 
       return _closeCommand; 
      } 
     } 

     void Close() 
     { 
      Application.Current.Shutdown(); 
     } 
     #endregion 

     #endregion 
    } 
} 

它是正确的做这样或我需要创建为MenuItemViewModel类模型,并做另一种方式?

回答

2

是的,没有。

MVVM模式的本质在于规定您将拥有一个Model,但这并不意味着您需要完全实现MVVM。

您决定做什么取决于您的项目以及您对MVVM的理解(或解释)。在MVVM和MVC相结合之前,我采取了一种方法 - 即它有一个V/VM,然后是一个坐在它后面的控制器(控制器几乎就像一个超级模型)。如果你有一个非常简单的应用程序,那么没有必要仅仅为了图形纯度而使它变得复杂 - 如果适合你的目的,那么只需要一个视图和viewmodel。

要记住的是,一个模式只是一个配方或处方如何做某事。没有规则说你应该严格遵守它,在很多情况下你可能会发现你不能,因此你必须修改一个模式或使用几种模式 - 关键是要保持与你所做的一致。

相关问题