1

我最近开始学习 WPF + MVVM。有可能我用错了棍子的一端,或者完全按照应该做的方式做错了棍子。

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

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

详细信息视图需要能够查看/编辑和添加新项目。为此,我认为我应该有两个视图/模板,编辑订单视图和新订单视图/模板。在阅读过程中,我遇到了数据模板,并认为这是实现这一目标的好方法。

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

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

该视图与资源文件相关联:

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

这很好用,当应用程序启动时,它们的订单就会显示出来。我对订单细节开始的顺序开始(即它只有数据类型设置而不是定义的任何密钥。这很好,如果没有选择订单,那么在选择订单时,它将显示.

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

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

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

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

我主要有两个问题:

1)我将如何阻止模板显示,直到它有数据要显示?

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

4

1 回答 1

2

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

<ContentControl Content="{Binding Path=OrderViewModel}" 
                ContentTemplateSelector="{StaticResource MyCustomSelector}" />
于 2011-03-03T16:32:09.763 回答