获取呈现视图的上下文?

时间:2012-04-18 11:16:52

标签: wpf mvvm

在我的WPF应用程序中,我有一个名为CompanyViewModel的viewmodel类。

有时,此类的实例被设置为我的主窗口的DataContext,其定义如下:

<window x:Class= ..... >
    <Grid>
        <ContentControl Content="{Binding }"></ContentControl>
    </Grid>
</Window>

在这种情况下,我希望使用一个显示viewmodel的所有属性的视图。

其他时候,ListView控件将其itemsource设置为包含CompanyViewModel实例的集合。在这里,我希望使用一个只呈现一些重要属性的视图。

我在MainWindow.xaml的资源词典中有这个:

<DataTemplate DataType="{x:Type vm:CompanyViewModel}">
    <vw:CompanyView></vw:CompanyView>
</DataTemplate>

是否可以根据viewmodel绑定的上下文选择viewmodel的视图?例如,要在CompanyView窗口中显示ContentControl时使用TabControl,还是使用CompanyViewSmall中显示的ListView

1 个答案:

答案 0 :(得分:1)

首先在本地查找要使用的DataTemplate,然后在找不到Visual Tree层次结构时进一步查找。

因此,您可以指定DataTemplate在层次结构中使用更远的地方,以使用与正常情况不同的内容。

例如,以下内容将使用CompanyView位于可见树中CompanyViewModel的任何位置,但ListView指定为DataTemplate的特定<Window.Resources> <DataTemplate DataType="{x:Type vm:CompanyViewModel}"> <vw:CompanyView /> </DataTemplate> </Window.Resources> <ListView> <ListView.Resources> <DataTemplate DataType="{x:Type vm:CompanyViewModel}"> <vw:CompanyViewSmall /> </DataTemplate> </ListView.Resources> </ListView> 除外图。

ListView

您还可以使用隐式样式.Resources告诉它使用ListView中较小的模板,但是这会将较小的视图应用于任何ListView,而不仅仅是如果您将另一种样式应用于DataTemplate,则必须记住继承默认样式以保持较小的<Style TargetType="{x:Type ListView}"> <Style.Resources> <DataTemplate DataType="{x:Type vm:CompanyViewModel}"> <vw:CompanyViewSmall /> </DataTemplate> </Style.Resources> </Style>

{{1}}