我正在使用caliburn.micro编写一个WPF应用程序来处理数据库。我使用实体框架与数据库优先方法(因为我已经有一个数据库)来生成类。是否有可能使实体框架成为继承PropertyChangedBase类校准的gererate类或使它们实现IHandle接口。我需要这些类来让视图知道数据何时被更改。
答案 0 :(得分:1)
答案 1 :(得分:1)
纯粹的' MVVM的做法(它不是一成不变的,许多人在他们的模型中实现通知)将反映视图模型中的属性。
以Person
为例,您的模型是一个简单的POCO:
public class Person
{
public String FirstName { get; set; }
public String Surname { get; set; }
}
您的视图模型将其转换为可查看的内容,非常简单的版本可以使用'模型'作为它的支持领域:
public class PersonViewModel : PropertyChangedBase
{
private Person person;
public Person Person
{
get { return person; }
set { person = value;
NotifyOfPropertyChange(() => FirstName);
NotifyOfPropertyChange(() => Surname)};
}
public String FirstName
{
get { return Person.FirstName; }
set
{
if (Person.FirstName != value)
{
Person.FirstName = value;
NotifyOfPropertyChange(() => FirstName);
}
}
}
public String Surname
{
get { return Person.Surname; }
set
{
if (Person.Surname != value)
{
Person.Surname = value;
NotifyOfPropertyChange(() => Surname);
}
}
}
}
如果您的模型通过EF链接到数据库,则在保存/加载更改等时也很有用。您可以实现保存/撤消或IsDirty跟踪:
public class PersonViewModel : PropertyChangedBase
{
private Person person;
public Person Person
{
get { return person; }
set { person = value; }
}
private String firstName;
public String FirstName
{
get { return firstName; }
set
{
if (firstName != value)
{
firstName = value;
NotifyOfPropertyChange(() => FirstName);
}
}
}
private String surname;
public String Surname
{
get { return surname; }
set
{
if (surname != value)
{
surname = value;
NotifyOfPropertyChange(() => Surname);
}
}
}
public void SaveToModel()
{
Person.FirstName = FirstName;
Person.Surname = Surname;
// trigger EF save?
}
public void LoadFromModel()
{
FirstName = Person.FirstName;
Surname = Person.Surname;
}
}
请参阅这些问题,以充分讨论在模型上实施PropertyChange的优缺点:
MVVM duplicating Model properties in ViewModel
In MVVM model should the model implement INotifyPropertyChanged interface?
In MVVM should the ViewModel or Model implement INotifyPropertyChanged?
完成这两项工作后,我建议您不要在模型中发出通知,并尽量保持尽可能简单。