WPF ViewModel与否ViewModel

时间:2015-02-15 18:52:19

标签: wpf entity-framework mvvm data-binding

我有商业模式(实际上它用于使用Entity Framework 6读取数据),如下所示:

class Profile : NameDescriptionBase
{
    public virtual float Rate {get;set;}
    public virtual float HoursPerWeek {get;set;}

    public virtual IList<Task> Tasks {get;set;}
}

class Task : NameDescriptionBase
{
    public enum TastStates
    {
        New, Finished, Stopped, InProgress
    }

    public virtual IList<Task> Tasks {get;set;}
    public virtual TastState {get;set;}
    public virtual IList<TimeSpan> LoggedPeriods {get;set}
}

我想将此模型绑定到TreeView并且工作正常(通过HierarchicalDataTemplate)。但是我想自定义每个树叶以将每个任务当前状态指示为组合框,以便用户能够更改它。在这里我卡住了。

我可以在数据上下文中实现服务方法,它提供与Tuple<int, string>的TaskState值和id的绑定,但我想将它绑定到每个任务。我的主视图模型(即DataContext)看起来像:

class MasterViewModel
{
   public List<Profile> Profiles {get;set;}
   public Profile CurrentProfile  {get;set}

   public List<Task> ActiveTasks {get;}
   public List<Tasl> FinishedTasks {get;}

   ....
}

因此,当前用户配置文件和相应任务列表更新正常,但看起来像绑定到Entity本身的属性不起作用。据我所知,我的实体不会实现INotifyPropertyChanged,因为它不是视图模型。

那么,对于我的案例,只有一种方法可以将每个任务转换为相应的视图模型,并且在每个操作之后将其实体与更新的字段保存到数据库中吗?看起来很难看。

2 个答案:

答案 0 :(得分:2)

MVVM模式的目的是首先提供View - Model分离。由于您的视图是与模型不同的概念,因此在视图中定义一个额外的类(所谓的视图模型)来表示您的实体是完全正确的。即使在每次更新时,TaskViewModel都会更新TaskEntity - 在调用SaveChanges()之前,不会将任何内容保存到db。

答案 1 :(得分:1)

考虑一个更简单的例子:


使用这三个类,您可以轻松显示您的个人资料(只读),但我敢打赌您已经知道:

  • ProfileEditor.xaml,您的视图

    • 控件绑定到Profiles
  • ProfileEditorViewModel.cs,您的ViewModel

    • public ICollection<Profile> Profiles { get; set; }
  • Profile.cs,您的模型


如果您希望能够更改模型,并且View具有响应性,那么您当然必须创建一个“迷你ViewModel”。在这个读写实现中,您可能有:

  • ProfileEditor.xaml,您的视图

    • 控件绑定到ProfileProxies
  • ProfileEditorViewModel.cs,您的ViewModel

    • public ICollection<ProfileProxy> ProfileProxies { get; set; }
  • ProfileProxy.cs,一个'迷你ViewModel'

    • 包装Profile,实施INotifyPropertyChanged
  • Profile.cs,您的模型