MVVMLight项目之双向数据绑定

 更新时间:2022年1月31日 22:54  点击:672 作者:Brand

MVVM和MVVMLight框架介绍及在项目中的使用详解

MVVMLight项目Model View结构及全局视图模型注入器

前篇我们已经了解了MVVM的框架结构和运行原理。这里我们来看一下伟大的双向数据绑定。

说到双向绑定,大家比较熟悉的应该就是AngularJS了,几乎所有的AngularJS 系列教程的开篇几章都要涉及到,真的是很好用。

表达的效果很简单:就是在界面的操作对数据模型的修改能实时反映到数据;而数据的变更能实时展现到界面。即视图数据模型(ViewModel)和视图(View)之间的双向绑定和触发。

我们来操作一个试试看:

第一步:先写一个Model,里面包含我们需要的数据信息

代码如下:

    /// <summary>
     /// 用户信息
     /// </summary>
     public class UserInfoModel : ObservableObject
     {
         private String userName;
         /// <summary>
         /// 用户名称
         /// </summary>
         public String UserName
         {
             get { return userName; }
             set { userName = value; RaisePropertyChanged(()=>UserName); }
         }
         private Int64 userPhone;
         /// <summary>
         /// 用户电话
         /// </summary>
         public Int64 UserPhone
         {
             get { return userPhone; }
             set { userPhone = value; RaisePropertyChanged(() => UserPhone); }
         }
         private Int32 userSex;
         /// <summary>
         /// 用户性别
         /// </summary>
         public Int32 UserSex
         {
             get { return userSex; }
             set { userSex = value; RaisePropertyChanged(()=>UserSex); }
         }
         private String userAdd;
         /// <summary>
         /// 用户地址
         /// </summary>
         public String UserAdd
         {
             get { return userAdd; }
             set { userAdd = value; RaisePropertyChanged(() => UserAdd); }
         }
    

第二步:写一个ViewModel

包含了View所需要的命令和属性:

    public class BothWayBindViewModel:ViewModelBase
     {
         public BothWayBindViewModel()
         {
             UserInfo = new UserInfoModel();
         }
         #region 属性
         private UserInfoModel userInfo;
         /// <summary>
         /// 用户信息
         /// </summary>
         public UserInfoModel UserInfo
         {
             get { return userInfo; }
             set { userInfo = value; RaisePropertyChanged(() => UserInfo); }
         }
         #endregion
         #region 命令
         #endregion
     }

第三步:在ViewModelLocator中注册我们写好的ViewModel:

SimpleIoc.Default.Register<BothWayBindViewModel>();

/*
   In App.xaml:
   <Application.Resources>
       <vm:ViewModelLocator xmlns:vm="clr-namespace:MVVMLightDemo"
                            x:Key="Locator" />
   </Application.Resources>
   In the View:
   DataContext="{Binding Source={StaticResource Locator}, Path=ViewModelName}"
   You can also use Blend to do all this with the tool's support.
   See http://www.galasoft.ch/mvvm
 */
 
 using GalaSoft.MvvmLight;
 using GalaSoft.MvvmLight.Ioc;
 using Microsoft.Practices.ServiceLocation;
 namespace MVVMLightDemo.ViewModel
 {
     /// <summary>
     /// This class contains static references to all the view models in the
     /// application and provides an entry point for the bindings.
     /// </summary>
     public class ViewModelLocator
     {
         /// <summary>
         /// Initializes a new instance of the ViewModelLocator class.
         /// </summary>
         public ViewModelLocator()
         {
             ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);
             #region Code Example
             ////if (ViewModelBase.IsInDesignModeStatic)
             ////{
             ////    // Create design time view services and models
             ////    SimpleIoc.Default.Register<IDataService, DesignDataService>();
             ////}
             ////else
             ////{
             ////    // Create run time view services and models
             ////    SimpleIoc.Default.Register<IDataService, DataService>();
             ////}
             #endregion
             SimpleIoc.Default.Register<MainViewModel>();
             SimpleIoc.Default.Register<WelcomeViewModel>();
             SimpleIoc.Default.Register<BothWayBindViewModel>();    
         }
         #region 实例化
         public MainViewModel Main
         {
             get
             {
                 return ServiceLocator.Current.GetInstance<MainViewModel>();
             }
         }
         public WelcomeViewModel Welcome
         {
             get
             { 
                return ServiceLocator.Current.GetInstance<WelcomeViewModel>();
             }
         }
         public BothWayBindViewModel BothWayBind
         {
             get
             { 
                 return ServiceLocator.Current.GetInstance<BothWayBindViewModel>();
             }
         }     
         #endregion
         public static void Cleanup()
         {
             // TODO Clear the ViewModels
         }
     }

第四步:编写View(注意标红的代码)

<Window x:Class="MVVMLightDemo.View.BothWayBindView"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         DataContext="{Binding Source={StaticResource Locator},Path=BothWayBind}"
         Title="BothWayBindView" Height="300" Width="300">
     <Grid>
             <StackPanel Orientation="Vertical" Margin="10,10,0,0">
                 <StackPanel Orientation="Horizontal" >
                     <TextBlock Text="请输入姓名:" ></TextBlock>
                     <TextBox Text="{Binding UserInfo.UserName,UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}" Width="200" ></TextBox>
                 </StackPanel>
 
                 <StackPanel Margin="0,10,0,0" Orientation="Horizontal" >
                     <TextBlock Text="Hello " ></TextBlock>
                     <TextBlock Text="{Binding UserInfo.UserName}" ></TextBlock>
                 </StackPanel>
 
                 <StackPanel HorizontalAlignment="Center" VerticalAlignment="Center" Orientation="Horizontal" >
                 </StackPanel>
                 
             </StackPanel>
     </Grid>
</Window>

效果如图所示(当修改输入框的内容的时候,对应绑定数据相应改变,并触发对UI的修改,所以下面那行文字也相应改变改变。):

前面我们已经了解到了,RaisePropertyChanged的作用是当数据源改变的时候,会触发PropertyChanged事件达到通知UI更改的目的(ViewModel => View)。

那View上的变化要怎么通知到数据源呢:

View中文本框绑定内容如下:

{Binding UserInfo.UserName,UpdateSourceTrigger=PropertyChanged,Mode=TwoWay},

大家会看到多了两个属性,一个是UpdateSourceTrigger,一个是Mode属性。

UpdateSourceTrigger的作用是 当做何种改变的时候通知数据源我们做了改变。

枚举类型效果
Default默认值(默认为LostFocuse)
Explicit当应用程序调用 UpdateSource 方法时生效
LostFocus失去焦点的时候触发
PropertyChanged数据属性改变的时候触发

这边我们直接使用 PropertyChanged,当UI数据改变的时候,我们再通知到数据源去做修改。

还有一个属性就是Mode,他有五个参数:

枚举类型效果
OneWay源发生变化,数据就会从源流向目标
OneTime绑定会将数据从源发送到目标;但是,仅当启动了应用程序或 DataContext 发生更改时才会如此操作,因此,它不会侦听源中的更改通知。
OneWayToSource绑定会将数据从目标发送到源
TwoWay绑定会将源数据发送到目标,但如果目标属性的值发生变化,则会将它们发回给源
Default绑定的模式根据实际情况来定,如果是可编辑的就是TwoWay,只读的就是OneWay

这边明显有很多种选择,明确一点的是,我们是想把View上的变化同步到ViewModel(Target => Source),所以使用OneWayToSource、TwoWay、Default或者不写都可以。

严谨点应该使用OneWayToSource。因为是文本框,属于可以编辑控件,所以 Default指向的是TwoWay。

下面还有一个TextBlock,仅仅用于显示的,所以不需要目标对源的修改,无需指定就默认是OneWay,当源改变的时候,会通知它进行修改。

以上就是MVVMLight项目之双向数据绑定的详细内容,更多关于MVVMLight项目双向数据绑定的资料请关注猪先飞其它相关文章!

原文出处:https://www.cnblogs.com/wzh2010/p/6286923.html

[!--infotagslink--]

相关文章

  • C# TextBox数据绑定的方法

    这篇文章主要为大家详细介绍了C# TextBox数据绑定的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
  • 利用js实现Vue2.0中数据的双向绑定功能

    vue数据双向绑定是通过数据劫持结合发布者-订阅者模式的方式来实现的,下面这篇文章主要给大家介绍了关于如何利用js实现Vue2.0中数据的双向绑定功能的相关资料,需要的朋友可以参考下...2021-07-19
  • 使用Vue3进行数据绑定及显示列表数据

    这篇文章主要介绍了使用Vue3进行数据绑定及显示列表数据,整篇文章围绕Vue3进行数据绑定及显示列表数据的想换自来哦展开内容,需要的小伙伴可以参考一下...2021-10-23
  • VUE JS 使用组件实现双向绑定的示例代码

    小编推荐的这篇文章介绍了VUE JS使用组件实现双向绑定的示例代码,有需要的同学快看看吧! 1.VUE 前端简单介绍 VUE JS是一个简洁的双向数据绑定框架,他的性能超过ANG...2017-01-22
  • ASP.NET数据绑定控件详解

    这篇文章主要为大家详细介绍了ASP.NET数据绑定控件,为大家解析了ListBox、GridView、Repeater三个数据绑定控件的“高效分页”,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-09-22
  • c#数据绑定之linq使用示例

    本实例以MS AdventureWorks2008Entities数据库为基础,演示了LINQ TO ENTITY、LINQ TO ENTITYSQL和LINQ TO ENTITYCLIENT。...2020-06-25
  • ASP.NET MVC DropDownList数据绑定及使用详解

    DropDownList 控件用于创建下拉列表。DropDownList 控件中的每个可选项都是由 ListItem 元素定义的!该控件支持数据绑定...2021-09-22
  • c#数据绑定之向查询中添加参数(.Net连接外部数据库)

    本实例主要练习了ADO.Net连接到外部数据库的基础上,向查询中添加参数。使用的是ACCESS数据库...2020-06-25
  • Vue数据双向绑定原理实例解析

    这篇文章主要介绍了Vue数据双向绑定原理实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-05-15
  • ASP.NET数据绑定的记忆碎片实现代码

    ASP.NET数据绑定的记忆碎片实现代码,需要的朋友可以参考下...2021-09-22
  • c#数据绑定之将datatabel的data添加listView

    这篇文章主要介绍了c#将DataTabel的data添加ListView的示例,实现功能是通过响应UI Textbox 的值向ListView 绑定新添加的纪录。,需要的朋友可以参考下...2020-06-25
  • asp.net数据绑定DataBind使用方法

    asp.net数据绑定DataBind使用方法,大家参考使用吧...2021-09-22
  • c#数据绑定之删除datatable数据示例

    这篇文章主要介绍了c#删除datatable数据示例,需要的朋友可以参考下...2020-06-25
  • Vue Object.defineProperty及ProxyVue实现双向数据绑定

    这篇文章主要介绍了Vue Object.defineProperty及ProxyVue实现双向数据绑定,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-09-03
  • asp.net 数据绑定时对数据列做个性化处理

    asp.net 数据绑定时对数据列做个性化处理,需要的朋友可以参考下。...2021-09-22
  • React实现双向绑定示例代码

    这篇文章给大家介绍了在React中如何实现双向绑定,文中给出了示例代码,对大家的理解与学习很有帮助,有需要的朋友下面来一起看看吧。...2016-10-03
  • WPF的数据绑定详细介绍

    数据绑定:是应用程序 UI 与业务逻辑之间建立连接的过程。 如果绑定正确设置并且数据提供正确通知,则当数据的值发生更改时,绑定到数据的视觉元素会自动反映更改。 数据绑定可能还意味着如果视觉元素中数据的外部表现形式发生更改,则基础数据可以自动更新以反映更改。...2021-09-22
  • .NET Core WebApi中如何实现多态数据绑定实例代码

    这篇文章主要给大家介绍了关于.NET Core WebApi中如何实现多态数据绑定的相关资料,文中通过示例代码介绍的非常详细,并给出来完整的实例代码,需要的朋友可以参考借鉴,下面来一起学习学习吧...2021-09-22
  • 数据绑定之DataFormatString使用介绍

    DataFormatString是很多Asp.Net控件都有的属性,如GridView等等,下面简单介绍一下这个属性,感兴趣的朋友不要错过...2021-09-22
  • vue自定义组件实现v-model双向绑定数据的实例代码

    vue中父子组件通信,都是单项的,直接在子组件中修改prop传的值vue也会给出一个警告,接下来就用一个小列子一步一步实现了vue自定义的组件实现v-model双向绑定,需要的朋友可以参考下...2021-10-08