16

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

寻找类似 ASP.NET MVC 中的类型化视图数据。

4

5 回答 5

4

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

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

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

于 2009-03-11T07:59:12.897 回答
3

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

于 2009-03-14T04:25:03.250 回答
3

FrameworkElement.DatatContext。启用数据绑定的依赖属性是 type object

正如其他人所指出的,您可以DataContext为称为 a 的特殊模板指定 a 的预期类型DataTemplate。许多控件(例如ItemsControlControlControl提供对 DataTemplates 的访问,以允许您设置可视化表示对 DataContext 类型的期望。

Bryan 是正确的,他没有测试他的代码。

类型化 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 类型的 Control.Template,它与 DataTemplate 完全不同。

我认为 Bryan 正在考虑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>
于 2009-03-20T04:34:21.567 回答
2

我个人为我的视图模型中的每个属性声明了一个静态 PropertyPath 引用 this 使用 x:static 作为绑定路径 - 例如

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

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

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

于 2010-10-15T09:35:19.393 回答
1

试试这个:

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

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

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

于 2009-03-11T13:41:44.620 回答