使用ViewModel基于ViewModel属性更改视图

时间:2014-07-23 17:08:47

标签: c# .net wpf

据我所知,在WPF中你可以这样做:

<Window.Resources>
    <DataTemplate DataType="{x:Type ViewModels:IronStage1ViewModel}">
        <Views:IronStage1View/>
    </DataTemplate>

    <DataTemplate DataType="{x:Type ViewModels:IronStage2ViewModel}">
        <Views:IronStage2View/>
    </DataTemplate>
    <Views:TestStageToTabIndexConverter x:Key="TestStageToTabIndexConverter" />
</Window.Resources>

我的问题: 有没有办法根据ViewModel中的属性选择View?

类似的东西:

<Window.Resources> //If property Selector==1
    <DataTemplate DataType="{x:Type ViewModels:IronStage1ViewModel}"> 
        <Views:IronStage1View/>
    </DataTemplate>

                   // If property Selector==2
    <DataTemplate DataType="{x:Type ViewModels:IronStage1ViewModel}">
        <Views:IronStage2View/>
    </DataTemplate>
</Window.Resources>

2 个答案:

答案 0 :(得分:3)

datatemplate选择器会这样做吗?

tutorial here

这适用于您的场景:

首先创建一个DataTemplateSelector:

public class IronStageTemplateSelector : DataTemplateSelector
{
    public DataTemplate IronStage1Template { get; set; }
    public DataTemplate IronStage2Template { get; set; }

    public object IronStage1Selector { get; set; }
    public object IronStage2Selector { get; set; }

    public override DataTemplate SelectTemplate(object selector,
      DependencyObject container)
    {
        if(selector == this.IronStage1Selector)
        {
            return IronStage1Template;
        }

        return IronStage2Template;
    }
}

我已经扩展了教程,以包含您可以指定何时返回每个模板的属性。

声明XAML资源

<UserControl.Resources>
    <DataTemplate x:Key="iron1Template">
        <TextBlock/>
    </DataTemplate>

    <DataTemplate x:Key="iron2Template">
        <Label />
    </DataTemplate>

    <System:Double x:Key="Selector1">1</System:Double>
    <System:Double x:Key="Selector2">2</System:Double>

    <local:IronStageTemplateSelector x:Key="IronStageTemplateSelector" 
                                     IronStage1Selector="{StaticResource Selector1}"
                                     IronStage2Selector="{StaticResource Selector2}"
                                     IronStage1Template="{StaticResource iron1Template}"
                                     IronStage2Template="{StaticResource iron2Template}"/>
</UserControl.Resources>

在这个例子中,我们声明了我们的选择器,以便当我们的属性值为1时,返回template1,否则我们得到模板2.

将控件添加到XAML 最后,需要一点点破解 - 你的VM属性需要是IEnumerable ......

<ItemsControl ItemsSource="{Binding toProperty}" 
     ItemTemplateSelector="{StaticResource IronStageTemplateSelector}">
</ItemsControl>

我希望这会有所帮助,如果您发现它有用,请标记为答案

答案 1 :(得分:0)

编译时是否已知类型的视图模型属性?如果是这样,您可以直接将控件添加到主(父)视图中,并将datacontext绑定到视图模型属性。

像这样......

   <Address:AddressControl Grid.Row="5" Grid.Column="0" Grid.ColumnSpan="6" DataContext="       {Binding PresentAddress}"/>

如果您有不同的情况,请告诉我。