Статическая проверка привязок

Или же "Как вы убедитесь, что все ваши привязки остаются правильными?"
(это довольно долго, но потерпите меня, я постарался сделать это как можно короче)

Рассмотрим следующий пример:

    <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>

Но вернемся к реальности. На самом деле все эти сны просто не произойдут в ближайшем будущем.

Тем не менее, я уверен, что я не первый человек, который имеет эту проблему.
Итак, наконец, вопрос заключается в следующем:Как вы убедитесь, что ваши привязки верны? И что они остаются такими?

Ответы на вопрос(2)

Ваш ответ на вопрос