我应该使用MVVM还是只使用ContentControl来加载屏幕?

时间:2012-10-17 11:44:02

标签: wpf mvvm prism mvvm-light

我正在开发一个具有以下布局的应用程序, 我对MVVM一无所知,而且我的时间紧迫。 右侧的红色区域是ContentControl。 左侧区域将是导航的侧栏

enter image description here

我的问题是

  1. 我应该遵循这个方法吗? http://channs.blogspot.com/2010/09/wpf-navigation.html
  2. 我应该使用MVVM light / Prism OR
  3. 我应该使用WPF页吗?
  4. 我目前倾向于选择1.它是否有任何利弊? 你会推荐哪个选项? 我的应用程序将始终只有一个开发人员,即Me,它将包含大约30个屏幕。

4 个答案:

答案 0 :(得分:2)

由于你的日程安排很紧,并且不了解MVVM(或Prism?),那么你最好不要使用选项3和1.从我的经验来看,开发人员需要很长时间才能起床加速MVVM和Prism。某些被视为理所当然的事情在MVVM / Prism世界中变得更加困难。

话虽如此,我是MVVM / Prism的大力倡导者,并且觉得值得付出额外的努力,特别是对于你这么大的项目。但是,由于时间紧迫,请不要打扰,只需进行代码隐藏。

答案 1 :(得分:1)

Prism需要时间学习,如果你的时间紧迫,那么我认为你应该选择你所知道的,当你有时间阅读棱镜书时,尤其是导航部分会有所帮助。

答案 2 :(得分:1)

不要使用PRISM,这对于这种非复杂的应用程序来说太过分了。如果你熟悉DataBinding,即使没有MVVM也可以节省很多时间。因为你很匆忙,我认为你应该选择你已经知道的东西,并开始轻松学习MVVM。祝你好运

答案 3 :(得分: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只包含模块的viewmodel和导航的漂亮显示名称。

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的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 }"/>

当然,你所有的视图模型都必须实现INotifyPropertyChanged,并正确地提升它。

ps:代码是在没有IDE的情况下编写的,因此忽略错误^^