Или ", как вы убедитесь, что все ваши привязки остаются верными?"
(это довольно длинный, но неся со мной, я старался сделать это как можно короче)
Рассмотрим следующий пример:
<TextBox Name="tb" />
<TextBlock Text="{Binding Text.TheProp, ElementName=tb}" />
Во время компиляции известно, что привязка неверна (т.е. синтаксический анализатор знает тип элемента tb
, и, следовательно, он знает тип его свойства Text
, и поэтому он знает, что TheProp
не существует).
Тем не менее, этот код будет компилироваться и выполняться (хотя с сообщением об ошибке привязки в отладочном выходе).
Такое поведение может оказаться очень полезным в некоторых ситуациях: независимо от того, какой именно тип данных есть, если у него есть соответствующие свойства, я в порядке. Таким образом, мы получаем вид "декларативной утиной печати".
Однако, утиная печать не всегда хорошая вещь.
В частности, при использовании шаблона MVVM я знаю (большую часть времени) точные типы всех объектов ViewModel. С другой стороны, модели становятся все более сложными с течением времени, и меня волнует будущий рефакторинг: что, если я решит переименовать некоторые свойства или, не дай бог, поместить их в отдельный агрегированный объект? Что произойдет со всеми моими привязками? Нужно ли мне рубить все файлы XAML? И даже без рефакторинга - что, если я просто сделаю опечатку?
Аналогичная проблема уже решена в других местах XAML. Если, например, вы поместили неправильное имя свойства в Style/Setter/@Property
, вы получите ошибку времени компиляции. TemplateBinding
также обеспечивает такую проверку. Это очень удобно.
Итак, в идеале, мне бы хотелось увидеть что-то вроде этого:
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>
Но вернемся к реальности. На самом деле все, что мечтает, просто не произойдет в ближайшем будущем.
Однако я уверен, что я не первый человек, у которого есть эта проблема.
Итак, наконец, вопрос: Как вы убедитесь, что ваши привязки верны? И что они остаются такими?