簡體   English   中英

如何在運行時設置視圖/視圖模型數據模板?

[英]How do I set view/view model data template at runtime?

MVVM的這些東西讓我很頭疼。 我有一個應用程序,在左窗格中有一個編輯器列表。 右邊是一個標簽控件,將在其中顯示編輯器。 我有一個主要的應用程序視圖模型,其中包含視圖模型的集合。 我稱這個集合為工作區。 這是從Microsoft 在此處提供的MvvmDemoApp中借用的。

public ObservableCollection<WorkspaceViewModel> Workspaces
{
  get
  {
    ...
  }
}

這些工作空間綁定到主應用程序窗口中的選項卡控件,如下所示:

<DataTemplate x:Key "WorkspacesTemplate">
  <TabControl
     IsSynchonizedWithCurrentItem="True"
     ItemSource="{Binding Workspaces}"
     SelectedItem="{Binding ActiveWorkspace}"/>
</DataTemplate>
...
<ContentControl
  Content="{Binding}"
  ContentTemplate="{StaticResource WorkspacesTemplate}"/>     

視圖模型使用DataTemplates綁定到視圖,如下所示:

<DataTemplate DataType="{x:Type vm:MessageLogViewModel}">
  <vw:MessageLogView/>
</DataTemplate>

這很好。 但是,現在我需要使應用程序可配置,從配置文件中讀取編輯器列表。 我想這個配置文件將包含每個編輯器的視圖和視圖模型組件。 但是,如何將兩者結合在一起,以便當有人綁定到視圖模型(或視圖模型的集合)時,顯示正確的視圖(類似於DataTemplate所做的,但在代碼中,而不是XAML)?

我試圖遠離控制反轉(IoC)技術。 我不確定我們的團隊是否已為此做好准備。

IoC是一個完美的解決方案,但是如果沒有此選項,則可以使用XmlWriter在視圖模型中創建XAML數據模板,並將其公開為要綁定的屬性。

編輯:綁定

您有視圖模型列表。 在每個視圖模型中(在基本視圖模型類中)創建並公開此XamlTemplate屬性。 該屬性應按照以下方式創建Xaml:

<DataTemplate xmlns:vw="...">
  <vw:MessageLogView/>
</DataTemplate>

然后使用ContentControl綁定到:

<ContentControl Content="{Binding ViewModel}"
                ContentTemplate="{Binding ViewModel.XamlTemplate}" />

暫無
暫無

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

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