我的模型是我的WPF应用程序的所有设置,并首先使用实体框架ctp5代码,这是一个示例模型类:
public class Task
{
public int ID { get; set; }
public int Index { get; set; }
public string Content { get; set; }
public int Indentation { get; set; }
public DateTime Start { get; set; }
public decimal Effort { get; set; }
public decimal CompletedEffort { get; set; }
public decimal Cost { get; set; }
}
构建视图模型的推荐方法是什么?我的视图模型将实现INotifyPropertyChanged,我不希望模型类具有任何UI特定代码 - 以便它们可以在其他应用程序中轻松重用。 我应该将所有模型属性设置为虚拟,然后在视图模型中覆盖它们吗? (似乎有很多不必要的编码...)EF代码首先会使用这种格式吗?
修改 这是一个有点类似的问题In MVVM should the ViewModel or Model implement INotifyPropertyChanged?但是,唯一的解决方案似乎是将我认为是UI逻辑添加到模型中。也许我可以在模型中添加某种委托并从viewmodel挂钩,然后将使用INotifyPropertyChanged ...这样的东西?
public class Task
{
public delegate void HandleChange(string propertyName);
public HandleChange ChangeHandler;
public int ID
{
get
{
return ID;
}
set
{
if(ID != value)
{
ID = value;
ChangeHandler("ID");
}
}
}
...
答案 0 :(得分:4)
我正在做的是将我的模型类的实例创建到ViewModel中的属性,然后直接在Model的Model上实现INotifyPropertyChanged
,在ViewModel上仅为Model实例实现,如此:
public class Task : INotifyPropertyChanged
{
// Implementation of INotifyPropertyChanged
// Raising the PropertyChanged event in the Setters of all properties
}
public class TaskViewModel : INotifyPropertyChanged
{
private Task _task;
public Task Task
{
get
{
return _task;
}
set
{
if (_task != value)
{
_task = value;
RaisePropertyChanged("Task");
}
}
}
// INotifyPropertyChanged implementation
}
然后在XAML中我直接绑定到Model属性,例如:
<TextBox Text="{Binding Task.Content}" />
(TaskViewModel将是View的DataContext。)
我这样做主要是为了避免你提到的“很多不必要的编码”,我找不到一个缺点。 (我也使用EF Code-First使我的模型持久化。)
答案 1 :(得分:3)
我知道这是一个老线程,但我在谷歌上搜索这个话题并偶然发现这篇blogs.msdn.com文章:http://bit.ly/iE3KHI
简而言之,从EF CodeFirst的CTP 4开始,CodeFirst dbSet对象的一个新属性.Local。 .Local是一个实现INotifyPropertyChanged的ObservableCollection。因此,如果您有一个代码,第一个dbcontext公开了一个名为Tasks的DbSet(Of Task),您可以将表单数据上下文设置为Tasks.Local。