我有一个业务模型(实际上它是用Entity Framework6读取数据的)看起来像这样:
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值和it的Tuple<int, string>绑定,但我希望将其绑定到每个任务。我的主视图模型(即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,因为它不是视图模型。
那么,对于我的案例来说,只有一种方法可以将每个任务转换为相应的视图模型,并在每次操作后将其实体和更新的字段保存到数据库中,这对吗?看起来很丑陋。
发布于 2015-02-16 04:05:16
MVVM模式的目的是首先提供视图-模型分离。因为你的视图是一个独立于模型的概念,所以在视图中定义一个额外的类(所谓的view model)来表示你的实体是非常好的。即使在每次更新时,您的TaskViewModel都会更新TaskEntity -在您调用SaveChanges()之前,不会将任何内容保存到数据库中。
发布于 2015-02-16 06:01:02
考虑一个更简单的例子:
使用这三个类,您可以轻松地显示您的配置文件(只读),但我打赌您已经知道:
查看您的视图
- Has a control bound to `Profiles`
- Has `public ICollection<Profile> Profiles { get; set; }`
如果你想改变你的模型,而视图是响应式的,你当然必须创建一个“迷你视图模型”。在这个读写实现中,您可能有:
查看您的视图
- Has a control bound to `ProfileProxies`
- Has `public ICollection<ProfileProxy> ProfileProxies { get; set; }`
- Wraps a `Profile`, implementing INotifyPropertyChanged
https://stackoverflow.com/questions/28529819
复制相似问题