2012-10-17 35 views
0

我正在開發一個具有以下佈局的應用程序, 我不瞭解MVVM,並且我處於緊張的時間表中。 右側的紅色區域是一個ContentControl。 左邊的區域將是一個側欄導航我應該使用MVVM還是僅使用ContentControl來加載屏幕?

enter image description here

我的問題是

  1. 我應該遵循這種形式給出 http://channs.blogspot.com/2010/09/wpf-navigation.html
  2. 我應該使用MVVM光/棱鏡
  3. 我應該使用WPF頁面嗎?

我目前傾向於選擇1.是否有任何優點和缺點呢? 你會推薦哪個選項? 我的應用程序總是隻有一個開發者,即Me,它將包含大約30個屏幕。

+0

早在2010年,我有機會見到比利先生霍利斯,並且有關於他的Stafflynx應用的小型聊天,他用選項1,是MVVM是他的應用程序矯枉過正的意見。 – Joseph

+0

你說「他的應用程序」。所以案件不是一般的。 – HichemSeeSharp

回答

2

既然你是在時間緊,沒有MVVM(棱鏡?)的知識,那麼你會更好的方式使用選項3和1。從我的經驗了,它需要開發者很長的時間來獲得加快MVVM和Prism的速度。某些被認爲是理所當然的事情,在MVVM/Prism世界變得更加困難。

有了這樣說,我MVVM /棱鏡的一個巨大的倡導者,並認爲這是非常值得的額外的努力,尤其是對你的尺寸的項目。但是,由於時間緊迫,不要打擾,只需執行代碼隱藏。

+0

感謝您的回覆 – Joseph

0

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這麼寫忽略錯誤^^

+0

感謝您的回覆 – Joseph

1

棱鏡需要時間來學習,如果你在緊張的最後期限話,我想你應該去你所知道的,當你有時間閱讀棱鏡書尤其是導航部分將有所幫助。

+0

感謝您的回覆 – Joseph

1

不要PRISM去,這將是對這種非複雜的應用程序矯枉過正。如果您熟悉DataBinding,即使沒有使用MVVM,也可以爲您節省大量時間。由於您很匆忙,我認爲您應該使用已知的知識,並開始學習MVVM。
好運

+0

感謝您的回覆 – Joseph

相關問題