[英]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.