这个问题已经引起了一段时间的头痛,它阻碍了项目的推进。考虑一个 WPF XAML 表单,其中控件绑定到 ViewModel。(我正在使用 Caliburn.Micro MVVM 框架和实体框架来处理数据)。shell 调用一个Initialize()
方法来从数据库加载表单的数据并设置 PropertyChanged 事件处理程序。有一个IsDirty
标志可以跟踪表单中是否有更改的数据。有一个绑定到IsDirty
属性的“保存”按钮,以便在数据更改时启用它。
// Sample code; forms have many controls....
// this is the property that the controls are bound to
public Entity BoundData { get; set; }
public void Initialize()
{
// this is an example line where I query the database from the Entity Framework ObjectContext...
BoundData = objectContext.DataTable.Where(entity => entity.ID == 1).SingleOrDefault();
// this is to cause the form bindings to retrieve data from the BoundData entity
NotifyOfPropertyChange("BoundData");
// wire up the PropertyChanged event handler
BoundData.PropertyChanged += BoundData_PropertyChanged;
IsDirty = false;
}
void BoundData_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
IsDirty = true;
}
// implementation of the IsDirty flag
public bool IsDirty
{
get
{
return _isDirty;
}
set
{
_isDirty = value;
NotifyOfPropertyChange("IsDirty");
}
}
问题是由于在方法完成BoundData_PropertyChanged
后从数据库初始化表单,导致事件处理程序被命中。Initialize()
因此,该IsDirty
标志设置为 true,并且启用了“保存”按钮,即使表单刚刚加载并且用户没有更改任何内容。我错过了什么?当然,这是一个常见问题,但我一直无法找到一个好的解决方案。这是我的第一个 MVVM 项目,所以我完全有可能遗漏了一些基本概念。
更新:为了澄清,我认为问题是我需要能够挂钩在所有绑定完成更新时将触发的事件或回调,因此我可以连接 PropertyChanged 事件处理程序。