【问题标题】:WPF ViewModel or not ViewModelWPF ViewModel 与否 ViewModel
【发布时间】:2015-02-15 18:52:18
【问题描述】:

我的业务模型(实际上是使用 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)。但是我想自定义每个树叶以将每个任务当前状态指示为组合框,以便用户能够更改它。在这里我卡住了。

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

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

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

   ....
}

因此,当前用户配置文件和相应任务列表更新正常,但看起来绑定到实体本身的属性不起作用。据我了解,这是预期的 - 我的实体没有实现 INotifyPropertyChanged,因为它不是视图模型。

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

【问题讨论】:

  • 您添加了视图模型吗?

标签: wpf entity-framework mvvm data-binding


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    考虑一个更简单的例子:


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

    • ProfileEditor.xaml,你的视图

      • 有一个绑定到Profiles的控件
    • ProfileEditorViewModel.cs,你的 ViewModel

      • public ICollection&lt;Profile&gt; Profiles { get; set; }
    • Profile.cs,你的模型


    如果你想改变你的模型,让视图响应,你当然必须创建一个“迷你视图模型”。在这个读写实现中,您可能有:

    • ProfileEditor.xaml,你的视图

      • 有一个绑定到ProfileProxies的控件
    • ProfileEditorViewModel.cs,你的 ViewModel

      • public ICollection&lt;ProfileProxy&gt; ProfileProxies { get; set; }
    • ProfileProxy.cs,一个“迷你 ViewModel”

      • 包装Profile,实现INotifyPropertyChanged
    • Profile.cs,你的模型

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-13
      • 1970-01-01
      • 2012-06-11
      • 1970-01-01
      • 2011-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多