基于WPF系统框架设计(6)-整合MVVM框架(Prism)

应用场景

咱们基础的框架已经搭建起来了,如今整合MVVM框架Prism,在ViewModel作一些逻辑处理,真正把界面设计分离出来。框架

这样方便咱们系统开发分工合做,同时提升系统可维护性和灵活性。函数

具体的Prism安装和Microsoft.Practices.Prism.dll获取,在这个网址:http://compositewpf.codeplex.com/this

原始的模式(Winform)

(1)如今看一下以前的设计的View: MainWindow.XAML源码:spa

image

(2)MainWindow.xaml.cs源码:设计

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using Fluent;
using Xceed.Wpf.AvalonDock.Layout;

namespace TLAgent.SecurityManager.WPF
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : RibbonWindow
    {
        public MainWindow()
        {
            InitializeComponent();
        }
        private void OnExitSystem(object sender, RoutedEventArgs e)
        {
            MessageBoxResult result = MessageBox.Show("肯定要退出系统吗?", "确认消息", MessageBoxButton.OKCancel, MessageBoxImage.Question);
            if (result == MessageBoxResult.OK)
            {
                Application.Current.Shutdown();
            }
        }
    }
}

传统模式问题在哪里?

如今若是咱们变一下View的Click事件名称OnExitSystem”,就直接报错了,由于这个事件名称必须跟View后台代码中的OnExitSystem一致,二者相互依赖,分不开了,动其中一个都会有问题,使编译出错。3d

image

一样,若是咱们把这个View删除,那后台代码的逻辑也同样被删除了,之前编写的逻辑都没有了。code

咱们如何可以达到二者分离,使逻辑部分功能可以很好地复用?orm

这就是咱们导入MVVM要解决的问题。对象

导入MVVM模式

步骤1:blog

  1. 在项目中引入Microsoft.Practices.Prism.dll.
  2. 新建几个目录:Models,ViewModels
  3. 在ViewModels下新建一个类跟MainWindow.xaml对应的ViewModel:MainWindowViewModel.cs

解决方案目录以下图:

image

步骤2:

  1. MainWindowViewModel这个类继承NotificationObject。

image

注意下图显示:NotificationObject是来自Microsoft.Practices.Prism.ViewModel

定义一个委托命令:DelegateCommand命名为ExitSystemCommand,并把它设为可读写。

在构造函数中实例化这个对象,并给它绑定一个方法OnExit,源码以下:

using Microsoft.Practices.Prism.ViewModel;

namespace TLAgent.SecurityManager.WPF.ViewModels
{
    public class MainWindowViewModel : NotificationObject
    {
        public DelegateCommand ExitSystemCommand { get; set; }

        public MainWindowViewModel()
        {
            ExitSystemCommand = new DelegateCommand(this.OnExit);
        }

        private void OnExit()
        {
            MessageBoxResult result = MessageBox.Show("肯定要退出系统吗?", "确认消息", MessageBoxButton.OKCancel, MessageBoxImage.Question);
            if (result == MessageBoxResult.OK)
            {
                Application.Current.Shutdown();
            }
        }
    }
}

前台View用Command绑定这个委托命令ExitSystemCommand

<!--Backstage Items-->
            <Fluent:Ribbon.Menu>
                <Fluent:Backstage Background="RoyalBlue">
                    <Fluent:BackstageTabControl Background="RoyalBlue">
                        <Fluent:Button Header="退出系统" Command="{Binding ExitSystemCommand}" Icon="Images\close.png"/>
                    </Fluent:BackstageTabControl>
                </Fluent:Backstage>
            </Fluent:Ribbon.Menu>

但是把程序运行点击仍是没有效果,还有关键的一步,加以下一行代码:

using System.Windows;
using Fluent;
using TLAgent.SecurityManager.WPF.ViewModels;

namespace TLAgent.SecurityManager.WPF
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : RibbonWindow
    {
        public MainWindow()
        {
            InitializeComponent();
            this.DataContext = new MainWindowViewModel();
        }

        private void OnExitSystem(object sender, RoutedEventArgs e)
        {
            MessageBoxResult result = MessageBox.Show("肯定要退出系统吗?", "确认消息", MessageBoxButton.OKCancel, MessageBoxImage.Question);
            if (result == MessageBoxResult.OK)
            {
                Application.Current.Shutdown();
            }
        }
    }
}

运行一下程序,点击“退出系统”按钮,效果出来了~~~

image

另外:this.DataContext = new MainWindowViewModel(); 也能够在View层的XAML里面写,参考以下:

image

这样,MainWindow 里的其余源码就能够清掉了,反原初始的默认状态。

using System.Windows;
using Fluent;
using TLAgent.SecurityManager.WPF.ViewModels;

namespace TLAgent.SecurityManager.WPF
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : RibbonWindow
    {
        public MainWindow()
        {
            InitializeComponent();
        }
    }
}

这一阶段只整合一个简单的示例,后续会添加更复杂ViewModel层的对View层控件的操做等功能。

示例源码

相关文章
相关标签/搜索