ItemsControl
escucha CollectionChanged
para gestionar la visualización de la colección de elementos que presenta en la pantalla. A ContentControl
escucha PropertyChanged
para administrar la visualización del elemento específico que se presenta en la pantalla. Es muy fácil mantener los dos conceptos separados en tu mente una vez que comprendas esto.
El seguimiento de si un elemento se edita no es algo que haga cualquiera de estas interfaces. Los cambios de propiedad no son ediciones, es decir, no representan necesariamente algún tipo de cambio iniciado por el usuario en el estado del objeto. Por ejemplo, un objeto puede tener una propiedad ElapsedTime
que se actualiza continuamente mediante un temporizador; la IU necesita ser notificada de estos eventos de cambio de propiedad, pero ciertamente no representan cambios en los datos subyacentes del objeto.
La forma estándar de rastrear si un objeto se edita es primero hacer que ese objeto implemente IEditableObject
. Luego puede, internamente a la clase del objeto, decidir qué cambios constituyen una edición (es decir, requiere que llame al BeginEdit
) y los cambios no. A continuación, puede implementar una propiedad booleana IsDirty
que se establece cuando se llama y se borra BeginEdit
cuando se invoca EndEdit
o CancelEdit
. (Realmente no entiendo por qué esa propiedad no es parte de IEditableObject
; aún no he implementado un objeto editable que no lo requiera).
Por supuesto, no hay necesidad de implementar ese segundo nivel de abstracción si no la necesita; sin duda puede escuchar el evento PropertyChanged
y solo asumir que el objeto ha sido editado si se lo plantea. Realmente depende de tus requisitos.
Esto generará una excepción en las operaciones Agregar y Eliminar, a menos que modifique la código para verificar si e.NewItems y e.OldItems son nulos antes de tratar de evitarlos. – Alain
¿Por qué necesita esta lista ModifiedItems cuando tiene la colección Names? –
Consulte mi edición de la respuesta anterior en http://stackoverflow.com/a/36398137/638977 –