La instancia original de su objeto NewsServer
no se ha modificado porque en realidad no la ha modificado. Después de su constructor se llama usted tiene los siguientes tres NewsServer
referencias:
newsServer = original instance
_newsServer = original instance
DataContext = clone of original instance
después el botón OK se hace clic en las referencias serán las siguientes:
newsServer = original instance
_newsServer = clone of original instance (possibly modified)
DataContext = clone of original instance (possibly modified)
Recuerde que los objetos son los tipos de referencia, en su asignación a _newsServer
solo está actualizando su referencia, no el valor del objeto en sí.
Para permitir la actualización del objeto NewsServer
en sí, hay dos opciones que se le ocurren, es probable que existan otras opciones, la primera es probablemente la más simple.
- implementar un método en el objeto
void Update(NewsServer source)
NewsServer
continuación, en lugar de realizar la nueva asignación para el campo _newsServer
lugar llamar al método de actualización en él y pasarle el valor DataContext
referencia.
- Exponga el valor
_newsServer
con una propiedad pública/interna. Puede hacer uso de esto a través de una variedad de mecanismos: responder explícitamente a un evento que se produce cuando cambia el valor de la propiedad; enlazar a la propiedad (por ejemplo, convertirla en una propiedad de dependencia o implementar INotifyPropertyChanged
); o simplemente espere que la persona que llama recupere el valor si y cuando el método ShowDialog()
retorna con un valor de true
.
Tenga en cuenta que si devuelve un poco de la lógica a la persona que llama, su clase de diálogo puede ser más simple. En particular, un enfoque es solo mantener el objeto clonado, expuesto a la persona que llama a través de una propiedad (por ejemplo, deshacerse del campo _newsServer
y simplemente usar DataContext
). Este objeto estaría vinculado a los elementos del diálogo como antes. El llamador simplemente recuperaría la referencia de esta instancia en un resultado true
del método ShowDialog()
.
Por ejemplo:
NewsServer newsServer = ...;
EditServerDialog editServerDialog = new EditServerDialog(newsServer);
if (editServerDialog.ShowDialog() == true)
{
newsServer = editServerDialog.DataContext;
}
El objeto clonado simplemente sería ignorado por la persona que llama si el cuadro de diálogo se cancela, y por lo tanto el método ShowDialog()
devuelve false
. Podría reutilizar la propiedad DataContext
como se muestra arriba, o podría crear una propiedad diferente (por ejemplo, NewsServer
) que simplemente devuelve el valor de propiedad DataContext
(es decir, hacer que el código sea un poco más claro en la interfaz pública de la clase de diálogo).
Podría ser útil si muestra la configuración de encuadernación. –
Ejemplo de enlace: {Vinculación NeedAuthentication, UpdateSourceTrigger = LostFocus, Mode = TwoWay}. El enlace es correcto porque this.DataContext contiene los datos correctos. – ErikTJ