0

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

在此处输入图像描述

我的问题是

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

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

4

4 回答 4

2

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

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

于 2012-10-17T12:07:46.687 回答
1

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

于 2012-10-18T06:30:21.383 回答
1

不要使用 PRISM,这对于此类不复杂的应用程序来说太过分了。如果你熟悉DataBindingMVVM 的话,即使没有 MVVM 也能节省你很多时间。既然你赶时间,我觉得你应该从你已经知道的开始,从容地开始学习 MVVM。
祝你好运

于 2012-10-18T07:16:48.197 回答
0

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
}

现在您可以让 mainview 运行了 :) 您只需将 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的情况下编写的,所以忽略错误^^

于 2012-10-17T14:08:00.267 回答