mvvm並不難。在你的情況下,你首先需要一個mainviewmodel。
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我的應用程序,但它的硬編碼也行),您的收藏與所有模塊(的ViewModels)您在頂部屏幕上想要顯示。 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
}
現在你已經全部讓mainview運行:)你只需要將MainWindow的datacontext設置爲你的MainViewModel。
mainwindow.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 }"/>
所有的ViewModels必須實現,當然INotifyPropertyChanged的,並適當提高了。
PS:代碼是沒有IDE這麼寫忽略錯誤^^
早在2010年,我有機會見到比利先生霍利斯,並且有關於他的Stafflynx應用的小型聊天,他用選項1,是MVVM是他的應用程序矯枉過正的意見。 – Joseph
你說「他的應用程序」。所以案件不是一般的。 – HichemSeeSharp