我有商业模式(实际上它用于使用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,因为它不是视图模型。
那么,对于我的案例,只有一种方法可以将每个任务转换为相应的视图模型,并且在每个操作之后将其实体与更新的字段保存到数据库中吗?看起来很难看。
答案 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,您的模型