2014-07-23 83 views
1

据我所知,在WPF,你可以做这样的事情:更改视图基于一个ViewModel财产

<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中的属性?

是这样的:

<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> 
+0

数据触发器浮现在脑海中,这也可以通过转换器完成。你有一个你感兴趣的具体实现吗? – BradleyDotNET

+0

对不起,我不明白你的意思是什么意思,具体实现方法。但仅仅是说我正在使用Ninject作为我的DI容器,并且尽量服从所有设计模式。 –

回答

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,则返回模板1,否则我们得到模板2.

添加控制到XAML 最后,需要一点小技巧 - 您的VM属性需要IEnumerable ...

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

我希望这可以帮助,请标记为答案,如果你发现它有用

+0

这应该是答案,但你会想给一些细节,以防万一网址变得无效。 –

+0

当然 - 从手机发布的答案,明天将从桌面更新。 – kidshaw

+1

谢谢@kidshaw。有用。对于那些想要查看DataTemplateSelector的视频教程的用户,请检查此(https://www.youtube.com/watch?v=CAbshQcI1BA) –

0

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

这样的事情..

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

只要让我知道,如果你有不同的情景。