RoutedUICommand Preview ¿Error ejecutado?

Estoy construyendo una aplicación usando el patrón de diseño MVVM y quiero hacer uso de los RoutedUICommands definidos en la clase ApplicationCommands. Dado que la propiedad CommandBindings de una Vista (leer UserControl) no es una Propiedad de dependencia, no podemos vincular CommandBindings definidos en un ViewModel a la Vista directamente. Resolví esto definiendo una clase de vista abstracta que enlaza esto mediante programación, basada en una interfaz ViewModel que garantiza que cada ViewModel tenga una colección ObservableCollection de CommandBindings. Todo esto funciona bien, sin embargo, en algunos escenarios quiero ejecutar la lógica que se define en diferentes clases (View y ViewModel) mismo comando. Por ejemplo, al guardar un documento.

En ViewModel, el código guarda el documento en el disco:

private void InitializeCommands()
{
    CommandBindings = new CommandBindingCollection();
    ExecutedRoutedEventHandler executeSave = (sender, e) =>
    {
        document.Save(path);
        IsModified = false;
    };
    CanExecuteRoutedEventHandler canSave = (sender, e) => 
    {
        e.CanExecute = IsModified;
    };
    CommandBinding save = new CommandBinding(ApplicationCommands.Save, executeSave, canSave);
    CommandBindings.Add(save);
}

A primera vista, el código anterior es todo lo que quería hacer, pero TextBox en la Vista a la que está vinculado el documento, solo actualiza su Fuente cuando pierde su foco. Sin embargo, puedo guardar un documento sin perder el foco presionando Ctrl + S. Esto significa que el documento se guarda antes de que los cambios se actualicen en la fuente, ignorando efectivamente los cambios. Pero dado que cambiar UpdateSourceTrigger a PropertyChanged no es una opción viable por razones de rendimiento, algo más debe forzar una actualización antes de guardar. Entonces pensé, usemos el evento PreviewExecuted para forzar la actualización en el evento PreviewExecuted, así:

//Find the Save command and extend behavior if it is present
foreach (CommandBinding cb in CommandBindings)
{
    if (cb.Command.Equals(ApplicationCommands.Save))
    {
        cb.PreviewExecuted += (sender, e) =>
        {
            if (IsModified)
            {
                BindingExpression be = rtb.GetBindingExpression(TextBox.TextProperty);
                be.UpdateSource();
            }
            e.Handled = false;
        };
    }
}

Sin embargo, asignar un controlador al evento PreviewExecuted parece cancelar el evento por completo, incluso cuando configuro explícitamente la propiedad Handled en false. Entonces, el controlador de eventos executeSave que definí en el ejemplo de código anterior ya no se ejecuta. Tenga en cuenta que cuando cambio el cb.PreviewExecuted a cb.Ejecuted ambas piezas de códigohacer ejecutar, pero no en el orden correcto.

Creo que esto es un error en .Net, porque debería poder agregar un controlador a PreviewExecuted y Executed y hacer que se ejecuten en orden, siempre que no marque el evento como manejado.

¿Alguien puede confirmar este comportamiento? ¿O estoy equivocado? ¿Hay una solución para este error?

Respuestas a la pregunta(2)

Su respuesta a la pregunta