通过名称而不是通过类型推断设置ContentTemplate时的差异

时间:2011-03-03 16:15:31

标签: wpf datatemplate contentcontrol

我最近开始学习WPF + MVVM。我可能有完全错误的操作杆或错误的操纵杆。

我正在尝试创建一个简单的订单应用,它有订单商品,每个订单都有lineitems。主页上有两个部分(首先是它们都是用户控件)。

顶部绑定到订单列表。底部绑定到当前选定的订单(想法是它将显示该订单的详细信息)。

详情视图需要能够查看/编辑和添加新项目。为此我想我应该有两个视图/模板,编辑顺序视图和新的顺序视图/模板。在我阅读期间,我遇到了数据表,并认为这是实现这一目标的好方法。

在我的mainwindow.xaml中,我将订单列表视图绑定如下:

<ContentControl Content="{Binding Path=OrdersViewModel}"

视图连接在资源文件中:

<DataTemplate DataType="{x:Type vm:AllOrdersViewModel}">
    <vw:AllOrdersView />
</DataTemplate>

这很有效,当应用程序启动时,它们会显示订单。我对订单详细信息做了同样的事情(即它只设置了数据类型而不是任何键定义。这很好用,如果没有选择订单那么视图就不会显示,当选择订单时它会显示出来

我目前正在尝试将其更改为模板,以便我可以动态切换模板/视图,以便当用户点击新订单时(viewmodel有一个枚举,说明订单的当前状态,所以我会检查对于枚举值),视图应该改变。

如果我尝试以下操作,它会爆炸。应用程序启动,显示订单列表(此时没有选择订单),并显示详细信息视图,然后其中一个转换器将因dependencyproperty.unsetvalue而爆炸,(旁注,我应该经常检查那?)。理想情况下,我不希望在选择订单之前显示视图:

<ContentControl Content="{Binding Path=OrderViewModel}" ContentTemplate="{StaticResource ordertemplate}" />

   <DataTemplate x:Key="ordertemplate">
       <TextBlock Text="hello" />
    </DataTemplate>

我主要有两个问题:

1)如何在显示数据之前停止显示模板?

2)如何根据枚举动态切换视图/模板?

1 个答案:

答案 0 :(得分:2)

用于这种情况的最直接的机制是DataTemplateSelector,它包含您编写的代码,可以检查绑定对象,在本例中是您的ViewModel,并选择要使用的相应模板,包括处理no的情况细节选择。

<ContentControl Content="{Binding Path=OrderViewModel}" 
                ContentTemplateSelector="{StaticResource MyCustomSelector}" />