当前位置:网站首页 / WPF4.5系列 / 正文

AY讲解一些自己对MVVMLight的理解[2]

时间:2018年06月29日 | 作者 : aaronyang | 分类 : WPF4.5系列 | 浏览: 217次 | 评论 0

接下来简单使用下:

ML这个框架在App.xaml里面,加了个统一管理VM对象的类ViewModelLocator,这个类是WPF启动还是在开发时候都会加载的一个类。

image.png

对应App.xaml.cs就一个方法,Dispatcher初始化,这样界面线程调用方法就会有对象了,我看了实现的代码,

image.png

在WPF中,有个代码     UIDispatcher = Dispatcher.CurrentDispatcher;还有一些在切换到界面线程操作,他都会check一下,如果可以使用就切换界面线程然后 执行指定的action。

AY我看了一些ML的源代码。

image.png

看完整个初始化项目,AY跟大家总结一下,

ViewModelLocator是个开发时候或者运行时候,用SimpleIOC 注册和加载vm的对象。

     static ViewModelLocator()
        {
            ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);

            if (ViewModelBase.IsInDesignModeStatic)
            {
                SimpleIoc.Default.Register<IDataService, Design.DesignDataService>();
            }
            else
            {
                SimpleIoc.Default.Register<IDataService, DataService>();
            }

            SimpleIoc.Default.Register<MainViewModel>();
        }

这些代码,同样,他判断是否是开发时还是运行时,他这里写了1个数据操作接口,然后,1个提供 设计时的 演示数据,还有个是运行时候的实现,二者类,分别利用IOC 进行映射,从而让界面的model有数据。

所以

image.png

这几个文件我们讲完了。


最后一行,是把MainViewModel对象注册进去。

注册进去后,对外暴露 Main属性,方便view界面去拿 这个实体的实例,我们通过IOC可以控制实例,比如说 单例,拿完实例后,继续拿都是同一个对象,也可以每次都是新对象。

       /// <summary>
        /// Gets the Main property.
        /// </summary>
        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance",
            "CA1822:MarkMembersAsStatic",
            Justification = "This non-static member is needed for data binding purposes.")]
        public MainViewModel Main
        {
            get
            {
                return ServiceLocator.Current.GetInstance<MainViewModel>();
            }
        }

最后1行代码是

   /// <summary>

        /// Cleans up all the resources.

        /// </summary>

        public static void Cleanup()

        {

        }


用于你清理对象,ML在MainWindow的xaml.cs代码对Closing事件 调用的。

image.png

接下来我们看看MainViewModel类,页面的VM层

image.png

通过这里,我们看到 VM是继承 ViewModelBase的,所以我们新建页面,然后VM时候也要这样做,感觉目前手动建立有点累,你可以写项目模板再试。

第一行 IDataSetvice接口有个实例,因为我们在 ViewModelLocator的静态构造函数,向SIMPLEIOC中注册了实例。

SIMPLEIOC通过传统的构造函数 注入,所以此时_dataService是个实例了,,这就是IOC其中1个注入方式,构造函数注入,一般都是3种,还有方法参数注入,还有属性注入,微软的MEF也是IOC,用起来很舒服,WPF的标配。我曾经在NAudio项目看到 用的还不错。

====================www.ayjs.net       杨洋    wpfui.com        ayui      ay  aaronyang=======请不要转载谢谢了。=========

image.png image.png

在其中一个接口的实现中,传入了DataItem类型的实例item对象,所以在MainViewModel的GetData时候 匿名参数item可以点出Title属性获得值。

其实这里ML框架取数据干嘛的,表面上感觉数据弄复杂了,其实设计的很巧妙,第一,展示了  测试数据和 真实数据两种,第二也展示了  业务属性和 界面上的属性的分离。我们可以理解IDataService是DDD领域开发的接口层,通过IOC有对应实现,然后你在构造函数中获得,然后赋值给界面的绑定的属性上,从而让界面显示。 这里感觉有个问题,就是应该设计 假如网络请求方式调用数据,应该加个异步等待。不然界面会卡死。


在经历过 一番折腾 ,MainViewModel的WelcomeTitle属性终于有值了。那么界面怎么绑定的   MainViewModel呢?

答案在MainWindow.xaml里面有一行代码

这个啊,就是在App.xaml中定义的资源的引用,有个Key名字为Locator的资源,资源里面有个Main属性的对象,所以 xaml界面只跟ViewModelLocator类有耦合,跟MainViewModel耦合不大,在这里还可以管理MainViewModel的生命周期。

image.png

====================www.ayjs.net       杨洋    wpfui.com        ayui      ay  aaronyang=======请不要转载谢谢了。=========

关于页面的xaml的样式资源什么的,ML默认把他单独放在一个资源字典,在界面上引用资源字典,这都是wpf基础知识了。所以下面2个东西也讲完了。

image.png image.png

到此,默认ML的项目分解完了

image.png

接下来讲一下基础的命令操作。

在MainWindow加一个按钮

<Grid x:Name="LayoutRoot">
        <Grid.RowDefinitions>
            <RowDefinition Height="*"/>
            <RowDefinition Height="48"/>
        </Grid.RowDefinitions>

        <TextBlock FontSize="36"
                   FontWeight="Bold"
                   Foreground="Purple"
                   Text="{Binding WelcomeTitle}"
                   VerticalAlignment="Center"
                   HorizontalAlignment="Center"
                   TextWrapping="Wrap"  Grid.RowSpan="2" />
        <Button Grid.Row="1" Content="切换文字" Command="{Binding SwitchAY}"></Button>
    </Grid>

加一个命令

     /// <summary>
        /// Initializes a new instance of the MainViewModel class.
        /// </summary>
        public MainViewModel(IDataService dataService)
        {
            _dataService = dataService;
            _dataService.GetData(
                (item, error) =>
                {
                    if (error != null)
                    {
                        // Report error here
                        return;
                    }

                    WelcomeTitle = item.Title;
                });

            SwitchAY = new RelayCommand(() =>
            {
                WelcomeTitle = "Hello AY MvvmLight";
            });
        }

        ////public override void Cleanup()
        ////{
        ////    // Clean up if needed

        ////    base.Cleanup();
        ////}

        public ICommand SwitchAY { get; set; }


运行

image.png

单击按钮

image.png


在AYUI中,全都是MVC.Action和Mvc.Parameter和Mvc.Event,还有是否发送事件参数,也无需后台代码,而在ML框架中,如果控件没有Command,你需要使用Blend的行为知识。

AYUI批量路由中,可以在xaml中 输入 aymvc,然后tab tab就可以快捷创建路由代码,还支持过滤器的功能,让你在绑定的时候就执行过滤器。

image.png

AYUI迁移了ML框架的 消息,在AYUI中使用aysen+tab+tab快速创建消息send代码,使用ayreg+tab+tab快速创建注册代码。


在ML中 ,手动触发属性变化通知,是下面2个

image.png

image.png

在AYUI中是 OnProperyChanged("属性名"),当然也有批量通知。



在ML中,如果加1个新页面,你需要 一个xaml,一个对应的ViewModel,然后需要在ViewModelLocator中注册下,然后xaml页面顶部指定下属性,然后再对应ViewModel写代码,界面绑定。


在AYUI中,你需要右键解决方案,新建MVC页面即可,

xaml页面,可以快捷切换到Model和Controller

image.png

在controller也可以快速切换到 View和Model,在Model里,当然也可以快速切换到View和Controller,xaml.cs通过view上按F7快捷键进入。

AYUI有很完善的控件库,助你完成项目,还有 MVC的辅助快速类,比如在xaml上的GridService和AlignmentService等七八种,快速写页面,

AYUI也有动画库,有示例,你可以结合写很绚丽的项目。

AYUI更多东西,等待发现。




先讲到这里 ,这一篇博客,我们分解了  ML框架默认创建的项目,讲解一些开发流程。


====================www.ayjs.net       杨洋    wpfui.com        ayui      ay  aaronyang=======请不要转载谢谢了。=========




推荐您阅读更多有关于“”的文章

猜你喜欢

额 本文暂时没人评论 来添加一个吧

发表评论

必填

选填

选填

必填

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

  查看权限

作者:杨洋(AaronYang简称AY,安徽六安人)目前是个人,还没成立公司AY唯一QQ:875556003和AY交流

高中学历,2015年1月17日开始,兴趣学习研究WPF

声明:AYUI个人与商用免费,源码可购买。部分DEMO不免费

AYUI7.X MVC教程 更新如下:

第一课 第二课 程序加密教程

兼容XP到win10,vs2015/2017,最新AYUI:7.6.2.8

一次购买,永久免费更新,bug反馈及时修复,普通话回答你的问题,3个月的技术支持

AYUI7.6.X 企业服务详情:680元

AYUI7.6.X 官方风格详情:4000元

AYUI7.6.X 医疗+官方风格详情5000元

本AYUI知识版权最终归杨洋(AY)所有

本AYUI最终销售权归杨洋(AY)所有

vs2015 企业版密钥HM6NR-QXX7C-DFW2Y-8B82K-WTYJV

vs2017 企业版密钥NJVYC-BMHX2-G77MM-4XJMR-6Q8QF

标签列表