2009-05-22 12 views
6

¿Cómo proporcionar un deshacer/rehacer usando enlaces en WPF?Deshacer en Vinculaciones WPF

p. Ej. Implementa una vista maestra de detalles con enlaces. Después de la edición, los cambios se guardaron automáticamente mediante el enlace. Entonces quieres deshacer los cambios.

¿Hay algo listo para usar en la encuadernación para WPF? ¿WPF proporciona algunas estructuras o interfaces?

Esta pregunta no trata de cómo implementar deshacer/rehacer usando pilas.

Respuesta

5

Eche un vistazo a la interfaz IEditableObject. Le permite tomar una instantánea del objeto que lo implementa y luego retroceder a esa instantánea si es necesario.

+0

¿WPF usa la interfaz IEditableObject, es decir, invoca sus métodos? –

+0

Depende del control particular que estés usando. Por ejemplo, el control MS DataGrid lo hará. –

1

¿A qué está vinculado su databinding?

Si está enlazando datos a un DataSet puede deshacer los cambios utilizando el método DataSet.RejectChanges() siempre que no haya llamado a DataSet.AcceptChanges().

+0

¿Qué pasa con la vinculación general, p. a un objeto derivado de DependencyObject, o enlace de control a control? –

+0

Como Kent dice que si el objeto implementa el IEditableObject, usted está accediendo, pero si no es así, debe hacerlo manualmente. –

1

Puede que le resulte útil el Marco de Deshacer monitoreado. http://muf.codeplex.com/

No utiliza el patrón de comando "de arriba hacia abajo", sino que supervisa los cambios a medida que ocurren y le permite colocar un delegado en la pila de deshacer que invertirá el cambio.

En su caso, si está vinculando a un modelo/viewmodel subyacente, entonces podría conectar el marco para capturar estos cambios y luego deshacerlos/rehacerlos según sea necesario. Si el modelo implementa INotifyPropertyChanged y usa ObservableCollections, debe reflejar automáticamente las acciones realizadas en el modelo, incluidas las acciones de deshacer/rehacer.

Puede encontrar más información y documentación en el sitio codeplex en http://muf.codeplex.com/.