2009-05-05 9 views
4

In meiner XAML bekomme ich alle Kunden von auf eine GetAll Eigenschaft Bindung:Kann ich geworfene Ausnahmen in XAML behandeln?

<ListBox ItemsSource="{Binding GetAll}" 
    ItemTemplate="{StaticResource allCustomersDataTemplate}" 
    Style="{StaticResource allCustomersListBox}"> 
</ListBox> 

Die GetAll Eigenschaft ist eine beobachtbare Sammlung meiner Ansicht nach Modell, das das Modell ruft die ganze Sammlung von Kunden zu erhalten:

public class CustomersViewModel 
{ 
    public ObservableCollection<Customer> GetAll { 
     get 
     { 
      try 
      { 
       return Customer.GetAll; 
      } 
      catch (Exception ex) 
      { 
       throw new Exception(ex.Message); 
      } 
     } 
    } 
} 

Wenn im Modell etwas schief läuft (schlecht formatierte XML-Datei usw.), blubbert eine Ausnahme bis zu dieser GetAll-Eigenschaft im ViewModel.

Erste Frage: Ich war überrascht, dass XAML nichts mit Ausnahme zu tun scheint und nur geht voran und zeigt nichts an. Ist das Absicht? Ist das ein Teil des "Entkopplungsansatzes"?

Zweite Frage: Dies führt mich zu denken ich die Ausnahme in XAML umgehen konnte irgendwie, wie

Pseudo-Code:

<Trigger> 
    <Trigger.OnException> 
     <TextBox Text="The customer data could not be loaded."/> 
    </Trigger.OnException> 
</Trigger> 

ungefähr so ​​wie oben ist Code möglich?

Antwort

4

Erstens würde ich mir vorstellen, dass XAML-Ausnahmen nicht abgefangen werden sollen. Sie existieren eher als ein Werkzeug, um dem Entwickler zu zeigen, wie sie ihren XAML-Code reparieren müssen, obwohl sie natürlich zur Laufzeit (Initialisierung) wegen der dynamischen Natur von XAML-Markup auftreten müssen XAML-Ausnahmen ganz einfach, indem Sie den Aufruf innerhalb des Konstruktors Ihrer Windows Klasse an InitializeComponents umhüllen. Sie können dann entweder alle Ausnahmen oder speziell XamlParseException abfangen, je nachdem, was Sie für angemessen halten.

Beispiel von this blog post:

public partial class Window1 : System.Windows.Window 
{ 
    public Window1() 
    { 
     try 
     { 
      InitializeComponent(); 
     } 
     catch (Exception ex) 
     { 
      // Log error (including InnerExceptions!) 
      // Handle exception 
     } 
    } 
} 
1

Mein erster Gedanke ist, dass Sie eine ValueConverter, überprüfen Sie value==null verwenden könnte und dann einige beliebige Eigenschaft des View-Modell festgelegt, über einen Konverter Parameter. Sie könnten dann einen regulären Property-Trigger in Ihrem XAML verwenden, um den Fehler anzuzeigen.

Ich bin mir ziemlich sicher, dass du das auch mit einem verbindlichen Validator machen könntest, also würde ich zuerst dort nachsehen.

EDIT: Ja, einen Blick auf http://msdn.microsoft.com/en-us/library/ms753962.aspx für ein Intro nehmen Validierungsregeln verbindlich, .. das werden Sie auf dem richtigen Weg

+0

Ich brauchte diese für die Validierung, so helfen, danke, aber ich denke, die Validierung von Fehlerbehandlung getrennt ist, seltsam, dass die Fehlerbehandlung in XAML nicht möglich erscheint selbst, würden Sie denken, dass a Übliches Szenario: (1) Gegenstände abrufen und anzeigen, (2) wenn etwas schief geht, Daten abrufen, Nachricht Nr. 1 wie folgt anzeigen, (3) wenn noch etwas schief geht, Nachricht Nr. 2 so anzeigen, scheint dies so zu sein die Verantwortung des XAML-UI, dh etwas, auf das der Designer klicken können sollte. –

+0

Versuchen Sie, die erste Route, die ich dann erwähnt habe, hinunterzugehen. Wenn Sie mit einem MVVM-Muster arbeiten, sollte dies einfach zu implementieren sein. Sie möchten etwas wie eine 'BindingFailed' -Eigenschaft in der Klasse, an die Sie binden, die Sie dann in einem Eigenschaftstrigger in Ihrem XAML verwenden, um die' ControlTemplate' Ihres 'UIElement' zu ändern. Oder wenn Sie mehr als zwei Fehlerzustände benötigen, implementieren Sie den Fehler als enum oder Sie könnten sogar die BindingFailure-Eigenschaft als "BindingException" vom Typ "Exception" implementieren, wenn Sie die ExceptionMessage anzeigen möchten. – Stimul8d

2

Sie können die FallBackValue verwenden, um einen Wert zu schaffen, in verwenden die Bindung, wenn ein Fehler auftritt. Anders als mit FallBackValue können Sie keine Ausnahmen in XAML behandeln.

Sie könnten auch in TargetNullValue aussehen soll, die einen bestimmten Wert, der äquivalent zu Null machen (zB wenn Sie setzen TargetNullValue = 5 und Ihre Benutzer gibt 5 Ihr Setter wird Null erhalten und wenn Ihr Getter liefert die Bindung NULL wird 5 angezeigt) .

+0

Nice, hadn Ich stoße schon mal darauf. 1up für DAS! – Stimul8d

Verwandte Themen