Algo a tener en cuenta acerca de INotifyPropertyChanging
es que no puede detener el cambio de ocurriendo. Esto simplemente le permite registrar que se produjo el cambio.
Lo uso en un marco de trabajo mío para el seguimiento de cambios, pero no es un método apropiado para detener cambios.
Se podría ampliar su ViewModelBase
con un par interfaz personalizada/evento:
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;
}
}
En este punto, que había necesidad de añadir que por convención a sus modelos de vista:
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");
}
}
}
}
¿Qué es lo que quiere lograr aquí? ¿Cuál es el caso de uso para saber cuándo una propiedad está * sobre * cambiar? – ChrisF
Para verificar al usuario "¿Estás seguro?" para ciertos cambios ... Queremos asegurarnos de que los administradores quieren cambiar el nombre de usuario/inicio de sesión de un usuario y no actualizaron accidentalmente el campo. – michael