mejor solución para la simple necesidad
contestación de José es la mejor solución, con mucho, para su necesidad simple: Sólo tiene que utilizar el enlace de datos y dejar que el modelo de datos manejarlo.
respuesta a la pregunta planteada como
Hay escenarios más complejos cuando usted realmente no necesita el control después de absolutamente todo ha terminado de cargar y todos los eventos han disparado. No hay un solo evento que ocurra "último muerto", pero es fácil rodar el suyo de manera efectiva usando la cola Dispatcher.
Esta es la forma de hacerlo:
Dispatcher.BeginInvoke(DispatcherPriority.ContextIdle, new Action(() =>
{
var x = ComputeSomething(1, 2, 3);
DoSomething(x, "Test");
}));
Todo dentro de la {} se ejecutará cuando WPF termina todo con una prioridad más alta que ContextIdle, que incluye todos los controladores de eventos, eventos cargados, los eventos de entrada, lo que hace , etc.
secuencia de eventos cuando se crea una ventana y muestra
Conforme a lo solicitado, aquí está la secuencia de los eventos más importantes en WPF cuando se crea una ventana y s hown:
Constructores y getters/setters se llaman como se crean los objetos, incluyendo PropertyChangedCallback, ValidationCallback, etc., en los objetos que están siendo actualizados y cualquier objeto que heredan de ellos
Como cada elemento se agrega a un árbol visual o lógico que activa su evento Intialized, lo que hace que se encuentren Estilos y desencadenantes aplicados además de cualquier inicialización específica del elemento que pueda definir [nota: Evento inicializado no disparado para hojas en un árbol lógico si no hay PresentationSource (por ejemplo, ventana) en su raíz]
La ventana y todas las representaciones visuales no plegada sobre ella se miden, lo que provoca un ApplyTemplate en cada control, lo que hace que la construcción del árbol objeto adicional incluyendo más constructores y getters/setters
la ventana y todas las representaciones visuales no plegada sobre ella están dispuestos
la ventana y sus descendientes (tanto lógicas y visuales) recibir un evento Loaded
Cualquier enlaces de datos que fallaron cuando estaban primer conjunto se vuelve a intentar
La ventana y sus descendientes se les da la oportunidad de hacer que su contenido visualmente
los pasos 1-2 se realizan cuando se crea la ventana, si es o no se muestra. Los otros pasos generalmente no ocurren hasta que se muestra una ventana, pero pueden ocurrir antes si se activan manualmente.
Gracias por todas las buenas sugerencias. Terminé agregando un campo llamado "IsDirty" a mi objeto de datos de preferencias y luego vinculé la propiedad IsEnabled del botón aplicar a ese campo. De esta forma eliminé todos los eventos como lo sugirieron Joseph y Ascalonx. –