【问题标题】:Should I use MVVM or just a ContentControl for loading Screens?我应该使用 MVVM 还是只使用 ContentControl 来加载屏幕?
【发布时间】:2012-10-07 15:56:56
【问题描述】:

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

我的问题是

  1. 我应该遵循这种方法吗 http://channs.blogspot.com/2010/09/wpf-navigation.html
  2. 我应该使用 MVVM 灯/棱镜还是
  3. 我应该使用 WPF 页面吗?

我目前倾向于选项 1。它有什么优点和缺点吗? 你会推荐哪个选项? 我的应用程序将始终只有一个开发人员,即我,它将包含大约 30 个屏幕。

【问题讨论】:

  • 早在 2010 年,我有机会见到 Billy Hollis 先生,并就他的 Stafflynx 应用程序进行了简短的交谈,他使用了选项 1,并认为 MVVM 对他的应用程序来说太过分了。
  • 你说的是“他的应用”。所以情况不一般。

标签: wpf mvvm prism mvvm-light


【解决方案1】:

由于您的日程安排很紧,而且对 MVVM(或 Prism?)一无所知,那么使用选项 3 和 1 会更好。根据我的经验,开发人员需要很长时间才能起床在 MVVM 和 Prism 上加速。某些被认为是理所当然的事情,在 MVVM/Prism 世界中变得更加困难。

话虽如此,我是 MVVM/Prism 的忠实拥护者,并且觉得付出额外的努力是值得的,尤其是对于您这样规模的项目。但是,由于时间紧迫,请不要费心,只需执行代码隐藏即可。

【讨论】:

    【解决方案2】:

    Prism 需要时间来学习,如果你的时间紧迫,那么我认为你应该按照你所知道的去做,当你有时间阅读 prism 书时,尤其是关于导航的部分会很有帮助。

    【讨论】:

      【解决方案3】:

      不要使用 PRISM,这对于此类不复杂的应用程序来说太过分了。如果您熟悉DataBinding,即使没有 MVVM,也可以为您节省大量时间。由于您很着急,我认为您应该从已经知道的内容开始,轻松地开始学习 MVVM。
      好运气

      【讨论】:

        【解决方案4】:

        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。

        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 的情况下编写的,所以忽略错误^^

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-09-14
          • 2011-07-08
          • 2019-01-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多