Могу ли я получить строго типизированные привязки в WPF / XAML? - PullRequest
13 голосов
/ 11 марта 2009

Используя MVVM -шаблон, вы устанавливаете DataContext для определенной модели представления. Есть ли способ сообщить XAML тип DataContext, чтобы он проверял мои привязки?

Ищет что-то вроде типизированных данных в ASP.NET MVC.

Ответы [ 5 ]

4 голосов
/ 11 марта 2009

Вы можете написать каждую отдельную привязку строго напечатанным способом:

<TextBox Text="{Binding Path=(vm:Site.Contact).(vm:Contact.Name)}" />

Однако это не подтвердит тот факт, что TextBox DataContext имеет тип ViewModel.Site (и я думаю, что это невозможно, но я могу ошибаться).

3 голосов
/ 20 марта 2009

Нет. FrameworkElement.DatatContext - это свойство зависимости, которое разрешает привязку данных, имеет тип object.

Как отмечают другие, вы можете указать ожидаемый тип DataContext для специального шаблона, называемого DataTemplate. Многие элементы управления, такие как ItemsControl, ControlControl, предоставляют доступ к шаблонам данных, позволяя вам установить ожидания визуального представления типа DataContext.

Брайан прав, он не проверял свой код.

Правильное применение типизированного DataTemplate выглядит следующим образом:

<Window>
    <Window.Resources>
        <DataTemplate x:Key="TypedTemplate" DataType="{x:Type myViewModel}">
        ...
        </DataTemplate>
    </Window.Resources>
    <ContentControl Content="{Binding}" ContentTemplate="{StaticResource TypedTemplate}" />
</Window>

ContentPresenter наследуется непосредственно от FrameworkElement и не имеет свойства Template. Кроме того, свойство Template обычно ссылается на Control.Template типа ControlTemplate, который полностью отличается от DataTemplate.

Я думаю, что Брайан думал о ContentControl, который является одним из двух типов корневого контроля (другой - ItemsControl). ContentControl фактически наследуется от Control. Поэтому мы можем указать для него свойство Template, если захотим.

<Window>
   <Window.Resources>
      <DataTemplate x:Key="TypedTemplate" DataType="{x:Type myViewModel}">
      ...
      </DataTemplate>
      <ControlTemplate x:Key="ControlSkin" TargetType="{x:Type ContentControl}">
      ...
      </ControlTemplate>
   </Window.Resources>
   <ContentControl Content="{Binding}" ContentTemplate="{StaticResource TypedTemplate}" Template="{StaticResource ControlSkin}" />
</Window>
3 голосов
/ 14 марта 2009

Нет, текущая спецификация не имеет строгой типизации в Xaml. Я считаю, что в .Net 4.0 Xaml должен видеть потенциал для генериков. С учетом этого, я думаю, что в Xaml должно быть намного проще иметь строгую типизацию.

1 голос
/ 15 октября 2010

Я лично объявляю статический PropertyPath для каждого свойства в моей модели представления, ссылаясь на это, используя x: static в качестве пути привязки - * 1001 например *

public class MyViewModel
{
  public static PropertyPath MyPropertyPath = new PropertyPath("MyProperty");
  public bool MyProperty{get; set;}
}

xaml: {Binding Path={x:Static local:MyViewModel.MyPropertyPath}}

Таким образом, все мои привязки проверяются при сборке.

0 голосов
/ 11 марта 2009

Попробуйте это:

<Window>
    <Window.Resources>
        <DataTemplate x:Key="TypedTemplate" DataType="{x:Type myViewModel}">
            ...
        </DataTemplate>
    </Window.Resources>

    <ContentPresenter Content="{Binding}" Template="{StaticResource TypedTemplate}" />
</Window>

Я не тестировал этот код, но он должен дать вам идею. Контент-докладчик отобразит текущий DataContext, который будет использовать DataTemplate. Это не является строго типизированным в компиляторе, но немедленно выдаст ошибку времени выполнения при загрузке (в InitializeComponent окна). Вы должны легко это уловить в своем тестировании, если что-то сломается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...