gpt4 book ai didi

c# - 为什么没有人使用 INotifyPropertyChanging?

转载 作者:可可西里 更新时间:2023-11-01 08:10:11 35 4
gpt4 key购买 nike

我知道 MVVM 大量使用 INotifyPropertyChanged,但我从未见过 INotifyPropertyChanging 的任何用法。有什么理由吗?

如果我确实想使用它,将它集成到我的 MVVM 框架中的好方法是什么?我知道您不应该在 ViewModel 上使用 MessageBox,因为这样您就无法对其进行单元测试。那么,如何抛出一个警报,然后继续进行 PropertyChange(如果适用)呢?

最佳答案

关于 INotifyPropertyChanging 需要牢记的一点是您无法阻止更改的发生。这仅允许您记录发生的更改。

我在我的框架中使用它来跟踪更改,但它不是停止更改的合适方法。

您可以使用自定义接口(interface)/事件对扩展您的 ViewModelBase:

delegate void AcceptPendingChangeHandler(
object sender,
AcceptPendingChangeEventArgs e);

interface IAcceptPendingChange
{
AcceptPendingChangeHandler PendingChange;
}

class AcceptPendingChangeEventArgs : EventArgs
{
public string PropertyName { get; private set; }
public object NewValue { get; private set; }
public bool CancelPendingChange { get; set; }
// flesh this puppy out
}

class ViewModelBase : IAcceptPendingChange, ...
{
protected virtual bool RaiseAcceptPendingChange(
string propertyName,
object newValue)
{
var e = new AcceptPendingChangeEventArgs(propertyName, newValue)
var handler = this.PendingChange;
if (null != handler)
{
handler(this, e);
}

return !e.CancelPendingChange;
}
}

此时您需要按照惯例将其添加到您的 View 模型中:

class SomeViewModel : ViewModelBase
{
public string Foo
{
get { return this.foo; }
set
{
if (this.RaiseAcceptPendingChange("Foo", value))
{
this.RaiseNotifyPropertyChanging("Foo");
this.foo = value;
this.RaiseNotifyPropretyChanged("Foo");
}
}
}
}

关于c# - 为什么没有人使用 INotifyPropertyChanging?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7995893/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com