我正在使用带有 MVVM 模式的 WPF。
在我的模型类中,我使用派生自 PropertyChangingEventArgs 的自定义 EventArgs 实现了 INotifyPropertyChanging 接口。这是必要的,因为我希望能够“取消”属性设置器。
此事件正在包含该模型的 ViewModel 中处理。
在事件处理程序中,我必须调用数据库并根据结果有时我必须通过事件参数取消属性设置器。
该模型类似于以下内容:
public class CancellablePropertyChangingEventArgs : PropertyChangingEventArgs
{
public bool Cancel { get; set; }
}
public class Model : INotifyPropertyChanging
{
public string MyProperty
{
get { return _myProperty; }
set
{
var args = RaisePropertyChanging();
if(!args.Cancel)
_myProperty = value;
}
}
public CancellablePropertyChangingEventArgs RaisePropertyChanging([CallerMemberName] string propertyName = "")
{
var eventArgs = new CancellablePropertyChangingEventArgs(propertyName);
if(PropertyChanging != null)
{
PropertyChanging(this, eventArgs);
}
return eventArgs;
}
}
包含上述模型并处理 PropertyChanging 事件的视图模型,在事件处理程序中我有一个类似于此的代码:
private async void HandleModelPropertyChanging(object sender, PropertyChangingEventArgs e)
{
var args = e as CancellablePropertyChangingEventArgs;
if(args.PropertyName = "MyProperty")
{
var result = await CallToDataBaseAsync(...);
if(result == null)
args.Cancel = true;
}
}
我知道我的事件处理程序中的 async void 表示“一劳永逸”,因此事件处理程序继续在 CallToDataBaseAsync 处执行而不是等待它,因此 args.Cancel 将始终为假。
但是,在不阻塞 GUI 线程的情况下,我可以尝试其他任何可能的解决方案吗?