Silverlight DataForm, MVVM, objeto IEditable y EditTemplate personalizado. Cómo realizar la comprobación personalizada del estado sucio

Tengo un problema interesante con Silverlight DataForm y las colecciones secundarias. También tengo una solución que funciona, pero se siente como un truco (es is un truco) y me preguntaba si alguien tenía una solución más elegante.

Tengo un DataForm vinculado a una colección de GroupViewModels. Cada GroupViewModel tiene un ObservableCollection de UserViewModels que me gustaría que el usuario pudiera agregar y eliminar cuando se muestra el EditTemplate del DataForm.

La interfaz de usuario para hacer eso es un ComboBox simple con una lista de todos los usuarios y un ListBox de los usuarios actualmente en el grupo. Hay un botón para agregar y eliminar para mover un usuario de una lista a otra.

Ahora, ... el modelo de vista al que está vinculado el DataForm implementa IEditableObject, ... lo cual es genial porque obtengo un comportamiento de reversión si se cancela una edición, pero en este caso no es suficiente. Necesito una forma de decirle al DataForm si mi VM está en un estado sucio o no explícitamente.

Dado que mi ViewModel tiene una propiedad SelectedUserToAdd a la que está vinculado el SelectedItem del ComboBox de todos los usuarios, cuando el usuario selecciona un usuario para agregar, el evento PropertyChanged se activa en mi VM y el DataForm cree que algo ha cambiado y el botón de confirmación (OK) se enciende. También se enciende cuando se cambia la selección en el ListBox debido a la propiedad SelectedUserToRemove.

Obviamente, lo que quiero es que el botón de confirmación se encienda si los UserViewModels en ListBox han cambiado.

La solución es sencilla. Puedo detener el encendido del botón de confirmación si elimino la notificación de cambio de las propiedades SelectedUserToAdd y SelectedUserToRemove y puedo hacer que el botón de confirmación se encienda de nuevo usando una propiedad ficticia llamada 'Dirty' que genera NotifyPropertyChanged cuando se obtiene el comando AddUser o DeleteUser despedido.

Como digo, ... funciona pero se siente mal. Alguien tiene una mejor idea?

Muchas gracias por adelantado.

preguntado el 27 de agosto de 11 a las 14:08

1 Respuestas

Por mi experiencia, sé que DataForm no es ideal para usar y tiene algunas limitaciones. Dicho esto, creo que su solución es más limpia que la que propongo, pero solo le estoy dando una alternativa.

Puedo decirle una forma de hacer que el formulario de datos 'ignore' (no realmente) ciertas notificaciones de propiedad. Lo que podría hacer es verificar si una determinada propiedad se eleva y si esa propiedad debe ignorarse, ignore manualmente restablecer el botón de confirmación a su estado anterior:

        someViewModel.PropertyChanged += (sender, e) =>
                                             {
                                                 Grid dependencyObject = VisualTreeHelper.GetChild(TheDataForm, 0) as Grid;
                                                 var commitButton = dependencyObject.FindName("CommitButton") as Button;
                                                 commitButton.IsEnabled = !e.PropertyName.Equals("PropertyToIgnore");
                                             };

Luego puede modificarlo heredando del formulario de datos y creando una propiedad de dependencia en la que puede vincular las propiedades para ignorar.

Nuevamente, como dije, creo que su solución es la más limpia.

Respondido 27 ago 11, 19:08

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.