mvvm はそれほど難しくありません。あなたの場合、最初にメインビューモデルが必要です。
public class MainViewModel
{
private ICollectionView _myView {get;set;}
public ObservableCollection<MyModulWrapper> MyModules{get;set;}
public MyModulWrapper SelectedModul {get;set;}
public MainViewModel()
{
this.MyModules = new ObservableCollection<MyModulWrapper>();
//i use icollectionview because i often need sorting or filtering
this._myView = = CollectionViewSource.GetDefaultView(this.MyModules);
this._myView .CurrentChanged += (s, e) => { this.SelectedModul = this._myView .CurrentItem as MyModulWrapper; };
}
}
トップ画面に表示したいすべてのモジュール(ビューモデル)をコレクションに入力する必要があります(何らかの方法で-アプリにmefを使用しますが、ハードコードしても問題ありません)。MyModulWrapper には、モジュールのビューモデルとナビゲーション用の素敵な表示名が含まれているだけです。
public class MyModulWrapper
{
public string Displayname {get;set;}
public object Modul {get;set;}//instead of object you can take an interface or base class or whatever
}
これで、メインビューを実行できるようになりました:) MainWindowのデータコンテキストをMainViewModelに設定するだけです。
メインウィンドウ.xaml
<Window.Resources>
<!--for each viewmodel you wanna show create a datatemplate. so wpf knows how to render your viewmodel-->
<DataTemplate DataType={x:Type local:MyViewmodel4FirstButton>
<local:MyFirstButtonView />
</DataTemplate>
</Window.Resources>
<!-- for navigation -->
<ListBox ItemsSource="{Binding MyModules}"
SelectedItem="{Binding SelectedModul , Mode=OneWay}"
IsSynchronizedWithCurrentItem="true">
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Displayname}"/>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
<!-- all you need to show your selected modul - if you have a DATATEMPLATEs!! -->
<ContentControl Content="{Binding SelectedModul }"/>
もちろん、すべてのビューモデルは INotifyPropertyChanged を実装し、適切に上げる必要があります。
ps: コードは IDE なしで記述されているため、エラーは無視してください^^