2010-12-10 11 views
7

¿Puede pensar en un escenario donde IEditableObject seguiría siendo útil en una aplicación WPF basada en MVVM? Si es así, ¿tiene un ejemplo que demuestre esto?IEditableObject en MVVM

Respuesta

14

He usado IEditableObject en una de mis aplicaciones. Por ejemplo, si tiene un cuadro de diálogo para editar algo, puede implementar IEditableObject en su ViewModel. Llama al BeginEdit() cuando se abre el cuadro de diálogo, EndEdit() cuando el usuario hace clic en Aceptar y CancelEdit() cuando el usuario hace clic en cancelar.

IEditableObject es una buena interfaz en cualquier momento que desee poder deshacer los cambios.

+0

¿Implementa los métodos en cada clase de ViewModel o simplemente en la clase abstracta original? Si la clase original, ¿cómo lo haces allí? Estaba pensando en recuperar el modelo de la base de datos pero los modelos no tienen una clase principal conjunta. No estoy seguro sobre el método de reflexión porque solo edito la parte del modelo. –

+1

Depende. Solo lo implementaría en la clase base abstracta si los modelos tienen una funcionalidad común para ejecutar en estos eventos. Si es así, podrías implementarlo allí, pero dentro de él, llama a un método abstracto, como OnBeginEdit(), que las clases derivadas deben proporcionar. De esta forma, tiene cubiertas tanto la funcionalidad común como la específica. – Botz3000

+0

Tengo un ViewModel que es una colección de objetos. Quiero usar un cuadro de diálogo para editar el elemento de la vista de grilla seleccionada. ¿Qué implementa 'IEditableObject', la Vista que contiene la grilla, el ViewModel al que está ligada la grilla, o la clase de la que ViewModel contiene una colección? –

2

Dentro de un tipo que se muestra en un DataGrid. Esto era necesario ya que cuando estoy usando pestañas y un DataGrid se está almacenando dentro de esa pestaña cambiando las pestañas necesarias para forzar una confirmación por así decirlo dentro del DataGrid si una celda estaba activa; revertir los cambios ya que no fueron cometidos. T

Se está aplicando un comportamiento al DataGrid para lograr esta funcionalidad, pero la parte IEditableObject está debajo.

private IDatabaseConnection _copy; 

void IEditableObject.BeginEdit() 
{ 
    if (this._copy == null) 
     this._copy = _container.Resolve<IDatabaseConnection>(); 

    _copy.Database = this.Database; 
    _copy.DisplayName = this.DisplayName; 
    _copy.HostName = this.HostName; 
    _copy.Username = this.Username; 
    _copy.Password = this.Password; 
} 

void IEditableObject.CancelEdit() 
{ 
    this.Database = _copy.Database; 
    this.DisplayName = _copy.DisplayName; 
    this.HostName = _copy.HostName; 
    this.Username = _copy.Username; 
    this.Password = _copy.Password; 
} 

void IEditableObject.EndEdit() 
{ 
    _copy.Database = String.Empty; 
    _copy.DisplayName = String.Empty; 
    _copy.HostName = String.Empty; 
    _copy.Username = String.Empty; 
    _copy.Password = String.Empty; 
} 
2

Tengo una implementación de IEditableObject en mi solicitud para que pueda evitar la actualización de mi modelo de datos si lo que el usuario ha introducido no es válido, y hacer retroceder a los valores originales si el usuario abandona cambios.