Pregunta

Tengo la siguiente situación en la que se lanza una excepción en un Modelo ViewModel no burbujea hasta la aplicación_unhandledException en app.xaml.cs.

Tengo una Colectura Observable en el Modelo ViewModelo vinculado a los elementos CourceProperty en un Combobox. La SelecteTemProperty del ComboBox está vinculado a una propiedad en el modelado ViewModel.

Cuando los usuarios seleccionan una entrada en el Combobox, la propiedad se llama correctamente en ViewModel. Se realiza un poco de lógica y se establece otra propiedad (llamarla propiedad2) en ViewModel. Sin embargo, hay una excepción no controlada en la propiedad2. La excepción simplemente "desaparece": no se eleva en el hilo de la interfaz de usuario.

¿Alguna sugerencia sobre cómo solucionar generalmente este problema o un enfoque para atrapar excepciones en cualquier hilo?

Tenga en cuenta que tenemos un marco MVVM personalizado. Al principio, pensé que era un problema con nuestro marco. Después de muchas horas de depuración, decidí descargar Prism4 (http://www.microsoft.com/download/en/confirmation.aspx?id=4922) y ver si se podría reproducir un escenario similar en la aplicación de referencia de StockTrader.

¡Puedo reproducir exactamente el mismo escenario! Estaría encantado de proporcionar detalles sobre cómo establecer la excepción en Prism4.

Se agradece enormemente cualquier ayuda o consejo sobre un enfoque general para atrapar todas las excepciones no controladas en Silverlight.

Saludos, Travis

¿Fue útil?

Solución

Dado que el tiempo de ejecución le permite usar excepciones para fines de validación, la operación de valor para el valor de enlace del tiempo de ejecución está en un gran bloque de captura de prueba.

Eche un vistazo a System.Windows.Data.BindingExpression.UpdateValue () en ILSPY para obtener más detalles (en System.Windows. La versión WPF puede ser más fácil de entender (UpdateSource)).

No creo que sea posible personalizar el comportamiento del tiempo de ejecución para volver a solucionar sus propias excepciones. Puede ver en el código que vuelve a solucionar algunos críticos.

   OutOfMemoryException, StackOverflowException, AccessViolationException, ThreadAbortException

Dado que otras excepciones no son retrocedidas, de hecho, se manejan.

Creo que su solución es capturar la traza o tener su propio manejo de excepciones en los establecedores de propiedades.

Otros consejos

Recientemente encontré la forma en que capturar todas las excepciones vinculantes en todos los establecedores de propiedades (funciona en Silverlight 5):

public class Helper
{
    public static void EnableBindingExceptions(FrameworkElement element)
    {
        const BindingFlags flags = BindingFlags.Public | BindingFlags.FlattenHierarchy | BindingFlags.Static;
        var fields = element.GetType().GetFields(flags).Where(x => x.FieldType == typeof(DependencyProperty));
        foreach (var field in fields)
        {
            var dp = (DependencyProperty)field.GetValue(null);
            var be = element.GetBindingExpression(dp);
            if (be == null) continue;

            element.SetBinding(dp, new Binding(be.ParentBinding) {ValidatesOnExceptions = true, ValidatesOnNotifyDataErrors = true});
            element.BindingValidationError += OnBindingValidationError;
        }

        var childrenCount = VisualTreeHelper.GetChildrenCount(element);
        for (var i = 0; i < childrenCount; i++)
        {
            var child = VisualTreeHelper.GetChild(element, i) as FrameworkElement;
            if (child == null) continue;

            EnableBindingExceptions(child);
        }
    }

    private static void OnBindingValidationError(object sender, ValidationErrorEventArgs e)
    {
        throw new TargetInvocationException(e.Error.Exception);
    }
}

Luego, simplemente invoque el método de EnableBindingExcepciones para cada su punto de vista:

public partial class MyView : UserControl
{
    public MyView()
    {
        InitializeComponent(); 
        Helper.EnableBindingExceptions(this);
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top