使用MVVM模式,您可以将 DataContext 设置为特定的 ViewModel。现在有没有办法告诉 XAML DataContext 的类型,以便它验证我的绑定?
寻找类似 ASP.NET MVC 中的类型化视图数据。
您可以以强类型的方式编写每个单独的绑定:
<TextBox Text="{Binding Path=(vm:Site.Contact).(vm:Contact.Name)}" />
然而,这并不能验证 TextBox DataContext 是 ViewModel.Site 类型的事实(我认为这是不可能的,但我可能错了)。
不,当前规范在 Xaml 中没有强类型。我相信使用 .Net 4.0,Xaml 应该会看到泛型的能力。有了这个,我认为在 Xaml 中使用强类型应该会容易得多。
否FrameworkElement.DatatContext
。启用数据绑定的依赖属性是 type object
。
正如其他人所指出的,您可以DataContext
为称为 a 的特殊模板指定 a 的预期类型DataTemplate
。许多控件(例如ItemsControl
)ControlControl
提供对 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>
我个人为我的视图模型中的每个属性声明了一个静态 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}}
这样我的所有绑定都会在构建时得到验证。
试试这个:
<Window>
<Window.Resources>
<DataTemplate x:Key="TypedTemplate" DataType="{x:Type myViewModel}">
...
</DataTemplate>
</Window.Resources>
<ContentPresenter Content="{Binding}" Template="{StaticResource TypedTemplate}" />
</Window>
我还没有测试过这段代码,但它应该会给你这个想法。内容展示器将显示将使用 DataTemplate 的当前 DataContext。这在编译器中不是强类型的,但会在加载时立即引发运行时错误(在窗口的 InitializeComponent 中)。如果出现问题,您应该能够在测试中轻松捕捉到这一点。