• MvvmTest


    test  http://wenku.baidu.com/view/f93d2bd549649b6648d747b8.html###

    http://www.cnblogs.com/liuliuyingxia/archive/2012/08/25/2655856.html

    http://www.infoq.com/cn/news/2012/03/vs-11-unit-testing-fakes

    http://www.baidu.com/s?wd=fakes%BF%F2%BC%DC&tn=sogouie_dg

    http://msdn.microsoft.com/library/dd264975(v=vs.110)

    http://archive.msdn.microsoft.com/mag200902MVVM/Release/ProjectReleases.aspx?ReleaseId=2026

    http://www.cnblogs.com/facingwaller/archive/2010/11/06/1870608.html

    http://www.silverlightchina.net/html/tips/2010/1219/4257.html

    http://www.2cto.com/kf/201205/131626.html

    http://yangblog.iteye.com/blog/964369

    MVVMLight的使用方法  

    ViewModel 类中我们可以做许多的事情,可以给页面绑定的某个字段初始值,也可以初始绑定的事件等操作。如下所示:

    public class 要用的ViewModel: ViewModelBase

        {

            private TestContext _testContext;

            /// <summary>

            /// Initializes a new instance of the 要用的ViewModel class.

            /// </summary>

            public 要用的ViewModel ()

            {

                if (!IsInDesignMode) // 不是在使用Blend设计的模式下

                {

                    _ testContext = new TestContext();   // 使用的RIAService

                    BindCommand(); // 绑定 事件  (用于初始化事件的)

                    BindData();  // 绑定数据 (用于初始化数据的 

                }

                // 属性

                // 事件

                // 方法

            }

     

    1.      属性

    l  View 段要绑定某个字段或集合,在MVVMLight中通常的做法是绑定属性,在ViewModel中,属性是比较容易操作的,定义一个属性,然后进行一下简单的处理,如判断是否为空,是否相等(如果相等则不用进行值便通知等),在View中只要绑定一下就可以了。

       // public class要用的ViewModel

           private UserInfo  _userInfoModel;

            /// <summary>

            /// Test

            /// </summary>

            public UserInfo UserInfoModel  // 集合 ObservableCollection<UserInfoModel > UserInfoModels

     

            {

                get

                {

                    return _ userInfoModel;

                }

                set

                {

                    if (_userInfoModel == value)

                    {

                        return;

                    }

                    _ userInfoModel = value;

                    RaisePropertyChanged(“UserInfoModel”);

                }

            }

     

    l  在许多的MVVMLight介绍中,通常的绑定都是放在App.xmal中进行资源的绑定,既然可以抽出来了,那么自然的也可以绑定到相应的页面中,绑定的方法挺多的,可以合理的选择自己喜欢的。

    如果在页面中直接用,首先要做的事情就是命名空间的引入,我们一定要将ViewModel引入到我们的页面中,和正常引入类是一样的 

    xmlns:vm="clr-namespace:项目.命名空间A.命名空间B;assembly=项目.命名空间A"

      然后我们就要设定当前页的资源,

    <navigation:Page.Resources>

            <vm:要用的ViewModel  x:Key="vmTest"/>

    </navigation:Page.Resources>

    很好,这样我们就将ViewModel引入到了该页面中,同时我们可以通过Key “vmTest”来进行绑定了,如果单个的字段,则可以通过简单的绑定来实现,如:

       <TextBlock  Text={Binding  UserInfoModel .UserName, Source={StaticResourcevmTest}}/>

       如果要绑定的是集合则 如下面的所示:

       <ComboBox  Margin="0,0,10,0" Grid.Row="0"  Grid.Column="1" Height="20"ItemsSource="{Binding UserInfoModels ,Source={StaticResource pnvm}}"SelectedItem="{Binding UserInfoModel ,Source={StaticResourcepnvm},Mode=TwoWay}">

                                <ItemsControl.ItemTemplate>

                                    <DataTemplate>

                                        <ComboBoxItem Content="{BindingUserName}" ></ComboBoxItem>

                                    </DataTemplate>

                                </ItemsControl.ItemTemplate>

                            </ComboBox>

    从这里面就可看出 :在操作集合的时候,使用的是ObservableCollection ,可以值变通知的,对于绑定的集合来说,我们要的目的通常是现实或者从集合中选择某条,因此我们设置一个用于获取集合中选则的项。如果是DataGrid等,虽然没有选中也可以采用类似的方法进行接收。   

     

    2.      事件

    MVVMLight中,如果给某个控件绑定某些事件也是挺容易的事情,里面有一个RelayCommand,它实现了ICommand接口,因此我们在使用的时候可以轻松的实现命令的绑定,例如:

    <Button x:Name="OKButton" Content="Save" Width="75" Height="23"Margin="10,0,0,0" Command="{Binding  LoginTestCommand  Command,Source={StaticResource vmTest }}"/>

    那么Command命令在VM中又是怎样实现的呢:

    如下所示:

    Public RealyCommand LoginTestCommand

    {

    private set;

    get; }

    这样就可以了??

    我们只是定义了通知,还没有具体实现呢:

    Private void LoginTest()

    {

    // 实现

    if(UserInfo.UserName!=null && UserInfo.Password!=null) 

      //调用服务 -----

    }

     

    额!我们什么时候创建的RealyCommand 呢?当然在VM的构造函数中实现的了,如下所示:

    this. LoginTestCommand = new RelayCommand(LoginTest);

     

    页面转跳

         要想在MVVMLightViewModel中完成页面的转跳,用什么办法呢????

    如果不用MVVM框架的时候,我们会在后台的代码中直接写转跳的路径,用了MVVM就不能用这种办法了吧,那么我们用什么通知View 来进行页面转跳呢??? “通知”  à属性通知???

    ViewModel中有一个属性,用来传递可以转跳的NativationContext ,然后再转跳,有点太恶心了。。。。

    那么还有什么东西呢?那么看一下MVVMLight中提供的一些基础方法和属性吧。。。

    哦,不小心发现了下面的 类。。。。。继承自MessageBase,哦,消息,这是一个好动西。。。

     

    里面有NotificationMessage的方法,而且 还有不同的形式,看来有办法了,如果我们将要转跳的页面用消息的形式发个View,那么View 不就可以进行页面转跳了,如果页面在有什么Frame之类的,那也简单吧,sender帮到我们Frame上就可以了,如果页面之间传递实体呢,还有个target ,这样就可以根据自己的需求定制页面的转跳了。

     

    下面看一下Message  

    Messenger:用于ViewModelView之间传递的消息,注意系统的GalaSoft.MvvmLight.Messaging命名空间下已经预定义了一些常使用的消息处理类,

    DialogMessageNotificationMessageActionNotificationMessageWithCallback

     

     

     

    使用的时候先注册一个消息:

    在要响应的view中进行注册,也可以在其他的地方进行注册,不过要传递要注册的view,将this改成那个view

    Messenger.Default.Register<NotificationMessage>(this, "MainPageNavigation", RedirectNavigationPage);

     

    消息要做的事情:

         private void RedirectNavigationPage(NotificationMessage msg)

            {

                string navigationUri = msg.Notification;

                 ContentFrame.Navigate(new Uri(navigationUri,UriKind.Relative));

            }

     

    ViewModel中我们发送消息:

    Messenger.Default.Send(new NotificationMessage("/先学习/xxx"),"MainPageNavigation");

     

    这里面的其实就是在页面中定义好一个可以进行页面转跳的方法,里面转跳就和正常的一样了,然后通过消息来执行这个方法就是了。

     

    应该还有些东西,等感觉有必要的时候在贴出来吧..

  • 相关阅读:
    Linux 线程间通信方式+进程通信方式 总结
    使用opencv第三方库的makefile文件示例
    rplidar SDK 二次开发---之获取目标信息(0.1)
    #include "Target_orientation.h"
    opencv —— 调用摄像头采集图像 VideoCapture capture(0);
    cmake 支持-lpthread
    ROS下sensor_msgs::ImagePtr到sensor_msgs::Image之间的转换
    JAVA 校验身份证号码工具类(支持15位和18位)
    python面向对象游戏练习:好人坏人手枪手榴弹
    python 私有属性的作用
  • 原文地址:https://www.cnblogs.com/gengyuanchao/p/2875673.html
Copyright © 2020-2023  润新知