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

栏目: 编程工具 · 发布时间: 6年前

内容简介:接下来简单使用下:ML这个框架在App.xaml里面,加了个统一管理VM对象的类ViewModelLocator,这个类是WPF启动还是在开发时候都会加载的一个类。

接下来简单使用下:

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

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

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

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

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

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

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

看完整个初始化项目,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有数据。

所以

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

这几个文件我们讲完了。

最后一行,是把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事件 调用的。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

在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; }

运行

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

单击按钮

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

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

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

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

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

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

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

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

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

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

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

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

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

在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=======请不要转载谢谢了。=========

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


以上所述就是小编给大家介绍的《AY讲解一些自己对MVVMLight的理解[2]》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

How to Solve It

How to Solve It

Zbigniew Michalewicz、David B. Fogel / Springer / 2004-03-01 / USD 59.95

This book is the only source that provides comprehensive, current, and detailed information on problem solving using modern heuristics. It covers classic methods of optimization, including dynamic pro......一起来看看 《How to Solve It》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器