Question

J'ai la situation suivante où une exception lancée dans un ViewModel ne remonte pas à l'exception Application_UnhandledException dans App.xaml.cs.

J'ai un ObservableCollection dans le ViewModel lié à ItemSourceProperty dans un ComboBox. Le SelectedItemProperty du ComboBox est lié à une propriété dans le ViewModel.

Lorsque les utilisateurs sélectionnent une entrée dans le ComboBox, la propriété est correctement appelée dans le ViewModel. Un peu de logique est exécutée et une autre propriété (appelez-la property2) est définie dans le ViewModel. Cependant, il existe une exception non gérée dans property2. L'exception «disparaît» tout simplement - elle n'est pas déclenchée sur le fil d'interface utilisateur.

Avez-vous des suggestions pour résoudre ce problème de manière générale ou une approche pour intercepter les exceptions sur n'importe quel thread?

Notez que nous avons un framework MVVM personnalisé. Au début, je pensais que c'était un problème avec notre cadre. Après de nombreuses heures de débogage, j'ai décidé de télécharger Prism4 (http://www.microsoft.com/download/en/confirmation.aspx?id=4922) et de voir si un scénario similaire pouvait être reproduit dans l'application de référence StockTrader.

Je peux reproduire exactement le même scénario! Je serais ravi de vous fournir des détails sur la façon de configurer l'exception dans Prism4.

Toute aide ou pointeur sur une approche générale pour détecter TOUTES les exceptions non gérées dans Silverlight est grandement apprécié.

Cordialement, Travis

Était-ce utile?

La solution

Puisque le runtime vous permet d'utiliser des exceptions à des fins de validation, l'opération get-value-for-binding du runtime se trouve dans un gros bloc try-catch.

Jetez un œil à System.Windows.Data.BindingExpression.UpdateValue () dans ILSpy pour plus de détails (dans System.Windows. La version WPF peut être plus facile à comprendre (UpdateSource)).

Je ne pense pas qu'il soit possible de personnaliser le comportement du runtime pour renvoyer vos propres exceptions.Vous pouvez voir dans le code qu'il en renvoie certains critiques.

   OutOfMemoryException, StackOverflowException, AccessViolationException, ThreadAbortException

Puisque les autres exceptions ne sont pas renvoyées, elles sont en fait gérées.

Je pense que votre solution consiste soit à capturer la trace, soit à avoir votre propre gestion des exceptions dans les paramètres de propriété.

Autres conseils

Récemment, j'ai trouvé le moyen de capturer toutes les exceptions de liaison dans tous les setters de propriétés (fonctionne dans 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);
    }
}

Ensuite, appelez simplement la méthode EnableBindingExceptions pour chaque vue:

public partial class MyView : UserControl
{
    public MyView()
    {
        InitializeComponent(); 
        Helper.EnableBindingExceptions(this);
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top