2012-03-27 18 views
0

このMVVMのものは頭が痛いです。私は左ペインにエディタのリストを持つアプリケーションを持っています。右側には、エディタが表示されるタブコントロールがあります。私はビューモデルのコレクションを含むメインのアプリケーションビューモデルを持っています。私はこのコレクションをワークスペースと呼んでいます。これは、Microsoftが提供するMvvmDemoAppから借用されたhereです。実行時にビュー/ビューモデルのデータテンプレートを設定するにはどうすればよいですか?

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

これらのワークスペースはそれほどのようなメインアプリケーションウィンドウにタブコントロールにバインドされていますビューモデルはそうのようなDataTemplatesを使用して、ビューに関連付けられている

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

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

これは正常に動作します。しかし、今では、エディタのリストが設定ファイルから読み込まれる場所で、アプリケーションを設定できるようにする必要があります。この設定ファイルには、各エディタのビューとモデルコンポーネントが含まれていると思います。しかし、ビューモデル(またはビューモデルのコレクション)にバインドするときに、正しいビューが表示されるように(DataTemplateの機能に似ていますが、XAMLではなくコード内にあるように)、2つの方法を組み合わせる方法を教えてください。

私はInversion of Control(IoC)技術を離れようとしています。私たちのチームがそれほど洗練されていなければならないとは思えません。

答えて

1

これは完璧なソリューションですが、このオプションを使用しないと、XmlWriterを使用してビューモデルにXAMLデータテンプレートを作成し、それをバインドするプロパティとして公開できます。

編集:バインディング

あなたは、ビューモデルのリストを持っています。各ビューモデル(ベースビューモデルクラス内)でこのXamlTemplateプロパティを作成して公開します。あなたは手の込んだ

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

:プロパティは、の線に沿って、XAMLを作成する必要があります。

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

その後にバインドするContentControlを使うのか?誰がデータテンプレートプロパティにバインドするのですか? – bsh152s

+0

@ bsh152s:編集があなたにもう少しポインタを与えることを願っています。 –

関連する問題