Chr*_*eis 5 wpf entity-framework mvvm code-first ef-code-first
我的模型全部为我的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; }
}
Run Code Online (Sandbox Code Playgroud)
建议我的视图模型的推荐方法是什么?我的视图模型将实现INotifyPropertyChanged,我不希望模型类具有任何UI特定代码 - 以便它们可以在其他应用程序中轻松重用.我应该将所有模型属性设置为虚拟,然后在视图模型中覆盖它们吗?(似乎有很多不必要的编码...)EF代码首先使用这种格式很好吗?
编辑 这是一个有点类似的问题在MVVM中,ViewModel或Model应该实现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");
}
}
}
...
Run Code Online (Sandbox Code Playgroud)
我正在做的是将模型类的实例创建为 ViewModel 中的属性,然后INotifyPropertyChanged
直接在 Model 上实现 Model 属性,并在 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
}
Run Code Online (Sandbox Code Playgroud)
然后在 XAML 中我直接绑定到模型属性,例如:
<TextBox Text="{Binding Task.Content}" />
Run Code Online (Sandbox Code Playgroud)
(TaskViewModel 在这里是视图的 DataContext。)
我这样做主要是为了避免你提到的“大量不必要的编码”,而且我找不到缺点。(我也使用 EF Code-First 使我的模型持久化。)
归档时间: |
|
查看次数: |
6606 次 |
最近记录: |