使用MVVM - 模式将DataContext设置为特定的ViewModel。现在有没有办法告诉XAML DataContext的类型,以便它验证我的绑定?
在ASP.NET MVC中寻找类似于viewdata的内容。
答案 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
的预期类型。许多控件(例如ItemsControl
,ControlControl
提供对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中)。如果出现问题,您应该能够在测试中轻松捕捉到这一点。