我需要在由 OrmLite 实例化的对象上设置一个事件处理程序,并且除了访问 repo 中的每个 Get 方法(这显然不是一个好方法)之外,我无法找到一种好的方法来做到这一点。
提供一些背景知识 - 假设我有一个从数据库中提取的用户类;它还实现了 INotifyPropertyChanged。我想为该事件分配一个处理程序。从 Funq 自动填充它是理想的,但当然 OrmLite 不会要求 Funq 水合新对象。
所以我被困住了。
任何正确方向的提示将不胜感激。
我需要在由 OrmLite 实例化的对象上设置一个事件处理程序,并且除了访问 repo 中的每个 Get 方法(这显然不是一个好方法)之外,我无法找到一种好的方法来做到这一点。
提供一些背景知识 - 假设我有一个从数据库中提取的用户类;它还实现了 INotifyPropertyChanged。我想为该事件分配一个处理程序。从 Funq 自动填充它是理想的,但当然 OrmLite 不会要求 Funq 水合新对象。
所以我被困住了。
任何正确方向的提示将不胜感激。
在我看来,您将表示逻辑与数据访问逻辑混合在一起。如果我处于您的位置,我不会尝试INotifyPropertyChanged
在模型(例如您的 User 类)上实现。相反,我会创建一个ViewModel
并将数据绑定逻辑放在那里(MVVM Style)。
当你开始着手时,拥有INotifyPropertyChanged
数据模型并不完全合乎逻辑。例如,如果我要更新数据库记录,它不会触发此事件(但属性已更改)。它在 ViewModel 上更有意义。
除了解决您的原始问题之外,它还允许您聚合、组合和过滤数据以用于显示目的,从而使构建复杂屏幕变得更加容易。如果您需要从数据库、RSS 提要、股票行情 Web API 和 twitter 中提取信息,您可以在 ViewModel 中执行此操作。
public class User
{
[AutoIncrement]
public int Id { get; set; }
public string Name { get; set; }
}
public class UserViewModel : INotifyPropertyChanged
{
private string _name;
public UserViewModel(User user)
{
_name = user.Name;
}
public string Name
{
get { return _name; }
set {
if (value == _name) return;
_name = value;
OnPropertyChanged("Name");
}
}
public event PropertyChangedEventHandler PropertyChanged;
[NotifyPropertyChangedInvocator]
protected virtual void OnPropertyChanged(string propertyName)
{
if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
小提示:此答案是在使用 ViewModel 在屏幕上显示数据的上下文中编写的,但是,相同的概念适用于出于任何目的观察模型更改。