我可以在WPF / XAML中获得强类型绑定吗?

时间:2009-03-11 07:49:25

标签: wpf mvvm

使用MVVM - 模式将DataContext设置为特定的ViewModel。现在有没有办法告诉XAML DataContext的类型,以便它验证我的绑定?

在ASP.NET MVC中寻找类似于viewdata的内容。

5 个答案:

答案 0 :(得分:4)

您可以使用强类型方式编写每个单独的绑定:

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

然而,这不会验证TextBox DataContext是ViewModel.Site类型的事实(我认为这是不可能的,但我可能错了)。

答案 1 :(得分:3)

不,当前规范在Xaml中没有强类型。我相信,使用.Net 4.0,Xaml应该看到泛型的容量。有了这个,我认为在Xaml中进行强类型应该会容易得多。

答案 2 :(得分:3)

没有。 FrameworkElement.DatatContext是依赖项属性,它使数据绑定的类型为object

正如其他人所指出的,您可以为名为DataContext的特殊模板指定DataTemplate的预期类型。许多控件(例如ItemsControlControlControl提供对DataTemplates的访问,以允许您设置可视化表示对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属性通常是指ControlTemplate类型的Control.Template,它与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 :(得分:1)

我亲自为viewmodel中的每个属性声明一个静态PropertyPath,使用x:static作为绑定路径引用它 - e.g

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

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

这样我的所有绑定都会在构建时得到验证。

答案 4 :(得分:0)

试试这个:

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

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

我没有测试过这段代码,但它应该给你一个想法。内容呈现器将显示将使用DataTemplate的当前DataContext。这在编译器中没有强类型,但会在加载时立即抛出运行时错误(在窗口的InitializeComponent中)。如果出现问题,您应该能够在测试中轻松捕捉到这一点。