簡體   English   中英

使用ViewModel基於ViewModel屬性更改視圖

[英]Change View with its ViewModel based on a ViewModel Property

據我所知,在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>

datatemplate選擇器會這樣做嗎?

這里的教程

這是適用於您的方案的方式:

首先創建一個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>

我希望這有幫助,如果你發現它有用,請標記為答案

編譯時是否已知類型的視圖模型屬性? 如果是這樣,您可以直接將控件添加到主(父)視圖中,並將datacontext綁定到視圖模型屬性。

像這樣的東西..

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

如果你有不同的情況,請告訴我。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM