Statische Überprüfung von Bindungen
Oder "wie stellen Sie sicher, dass alle Ihre Bindungen korrekt bleiben?"
(das ist ein bisschen lang, aber ertrage es mit mir, ich habe versucht, es so kurz wie möglich zu machen)
Betrachten Sie das folgende Beispiel:
<TextBox Name="tb" />
<TextBlock Text="{Binding Text.TheProp, ElementName=tb}" />
Zum Kompilierungszeitpunkt ist genau bekannt, dass die Bindung falsch ist (d. H. Der Parser kennt den Elementtyptb
, und deshalb kennt es die Art von es istText
Eigenschaft, und daher weiß es, dassTheProp
existiert nicht).
Ja, dieser Code wird kompiliert und ausgeführt (obwohl in der Debug-Ausgabe eine verbindliche Fehlermeldung angezeigt wird).
Dieses Verhalten kann in einigen Situationen sehr nützlich sein: Unabhängig vom genauen Typ meiner Daten, sofern die Eigenschaften entsprechend benannt sind, ist alles in Ordnung. Auf diese Weise erhalten wir eine Art "deklaratives Entenschreiben".
Jedoc, Entenschreiben ist nicht immer eine gute Sache.
Während ich das MVVM-Muster verwende, kenne ich (meistens) die genauen Typen aller meiner ViewModel-Objekte. Andererseits werden die Modelle im Laufe der Zeit immer komplexer, was mich über zukünftige Umgestaltungen beunruhigt: Was passiert, wenn ich beschließe, einige Eigenschaften umzubenennen oder, Gott bewahre, sie in einem separaten aggregierten Objekt abzulegen? Was passiert dann mit all meinen Bindungen? Muss ich alle XAML-Dateien von Hand rechen? Und auch ohne Refactoring - was ist, wenn ich einfach einen Tippfehler mache?
Ein ähnliches Problem ist bereits an anderen Stellen von XAML gelöst. Wenn Sie beispielsweise einen falschen Eigenschaftsnamen in @ eingebStyle/Setter/@Property
, es wird ein Fehler bei der Kompilierung angezeigt.TemplateBinding
bietet auch eine solche Überprüfung. Welches ist sehr praktisch.
Also, im Idealfall würde ich gerne so etwas sehen:
ProductViewModel.cs:
public class ProductViewModel
{
public Name { get; set; }
public Price { get; set; }
}
ProductView.XAML:
<UserControl x:Class="Shopping.View.ProductView"
x:DataContextType="vm:ProductViewModel"
xmlns:vm="clr-namespace:Shopping.ViewModel"
... >
<TextBox Text="{Binding Name}" /> <!-- OK -->
<TextBox Text="{Binding Price}" /> <!-- OK -->
<TextBox Text="{Binding ABC}" /> <!-- Compile time error: there is no property ABC in ProductViewModel -->
</UserControl>
ShoppingCart.XAML:
<UserControl x:Class="Shopping.View.ShoppingCartView"
x:DataContextType="vm:ShoppingCartViewModel"
xmlns:vm="clr-namespace:Shopping.ViewModel"
... >
<ItemsControl ItemsSource="{Binding Products}"
ItemType="vm:ProductViewModel" > <!-- Static check happens here
ShoppingCartViewModel.Products must
implement IEnumerable<ProductViewModel> -->
<ItemsControl.ItemTemplate>
<DataTemplate DataType="vm:ProductViewModel">
<view:ProductView /> <!-- DataContext is known to be of correct type
because of DataTemplate.DataType property -->
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</UserControl>
Aber lasst uns zur Realität zurückkehren. In Wirklichkeit wird all das Träumen in naher Zukunft nicht passieren.
ch bin jedoch sicher, dass ich nicht die erste Person bin, die dieses Problem ha
Also, schließlich ist die Frage:Wie stellen Sie sicher, dass Ihre Bindungen korrekt sind? Und dass sie so bleiben?