Строго типизированная привязка данных в WPF / Silverlight / XAML?

Одна из моих самых больших проблем с тем, как привязка данных работает с XAML, заключается в том, что у вас нет возможности строго напечатать ваши привязки данных. Другими словами, в C #, если вы хотите получить доступ к свойству объекта, который не существует, вы не получите никакой помощи от Intellisense, и если вы настаиваете на игнорировании Intellisense, компилятор схватит вас и победит & apos; Я хочу, чтобы вы продолжили - и я подозреваю, что многие люди здесь согласятся, что это очень хорошая вещь. Но в привязке данных XAML вы работаете без сети. Вы можете связать сanythingдаже если он не существует. Действительно, учитывая причудливый синтаксис привязки данных XAML и мой собственный опыт, гораздо сложнее связать что-то с тем, что существует, чем с чем-то, что не существует. Я, скорее всего, неправильно понял синтаксис привязки данных, чем правильный; и сравнительное время, которое я трачу на устранение неполадок, связанных с привязкой данных XAML, легко сокращает время, которое я трачу на любую другую часть стека Microsoft (включая неудобный и раздражающий WCF, если вы можете в это поверить). И большая часть этого (не все) восходит к тому факту, что без строго типизированных привязок данных я не могу получить никакой помощи ни от Intellisense, ни от компилятора.

Итак, я хочу знать, почему MS по крайней мере не дает намoption иметь строго типизированные привязки данных: вроде как в VB6, мы могли бы сделать любой объект вариантом, если бы мы были действительно мазохистскими, но большую часть времени имело смысл использовать обычные типизированные переменные. Есть ли причина, по которой MS не может этого сделать?

Вот пример того, что я имею в виду. В C #, если свойство "UsrID" не существует, вы получите предупреждение от Intellisense и ошибку от компилятора, если попробуете это:

string userID = myUser.UsrID;

Тем не менее, в XAML вы можете делать все, что хотите:

<TextBlock Text="{Binding UsrID}" />

И ни Intellisense, ни компилятор, ни (что самое удивительное) само приложение во время выполнения не дадут вам никаких намеков на то, что вы сделали что-то не так. Теперь это упрощенный пример, но любое реальное приложение, которое имеет дело со сложными графами объектов и сложными пользовательскими интерфейсами, будет иметь множество эквивалентных сценариев, которые совсем не просты и не просты в устранении неполадок. И даже после того, как вы в первый раз установили, что он работает правильно, вы - СОЛ, если вы реорганизуете код и меняете имена свойств C #. Все будет скомпилировано, и оно будет работать без ошибок, но ничего не будет работать, оставляя вас в поисках и прокручивании всего приложения, пытаясь выяснить, что сломано.

Одно возможное предложение (от макушки головы, которое я не продумал) может быть примерно таким:

Для любой части логического дерева вы можете указать в XAML тип данных объекта, который он ожидает, примерно так:

<Grid x:Name="personGrid" BindingDataType="{x:Type collections:ObservableCollection x:TypeArgument={data:Person}}">

Возможно, это приведет к созданию строго типизированной коллекции ObservableCollection & lt; Person & gt; Свойство TypedDataContext в файле .g.cs. Итак, в вашем коде:

// This would work
personGrid.TypedDataContext = new ObservableCollection<Person>(); 

// This would trigger a design-time and compile-time error
personGrid.TypedDataContext = new ObservableCollection<Order>(); 

И если вы затем получите доступ к этому TypedDataContext через элемент управления в сетке, он будет знать, к какому объекту вы пытаетесь обратиться.

<!-- It knows that individual items resolve to a data:Person -->
<ListBox ItemsSource="{TypedBinding}">
    <ListBox.ItemTemplate>
       <DataTemplate>
           <!--This would work -->
           <TextBlock Text="{TypedBinding Path=Address.City}" />
           <!-- This would trigger a design-time warning and compile-time error, since it has the path wrong -->
           <TextBlock Text="{TypedBinding Path=Person.Address.City} />
       </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

Я сделал запись в блогеВот это объясняет больше о моем разочаровании связыванием данных WPF / XAML, и то, что я думаю, было бы значительно лучшим подходом. Есть ли какая-либо причина, по которой это не может работать? И кто-нибудь знает, планирует ли MS решить эту проблему (в соответствии с моим предложением, или, надеюсь, лучше)?

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

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