MvvmLight框架的基本使用
关于MvvmLight框架的介绍可以看这篇,说的很详细,在此记录下来以作复习,通过一个简单的例子说明MvvmLight的基本使用
https://www.cnblogs.com/3xiaolonglong/p/10001787.html
首先MvvmLight框架最大的优点就是起到分离试图(View)和模型(Model)的作用,相对于之前把逻辑结构写在Code Behind 的方式,MVVM模式几乎完全解耦了视图和逻辑业务的关系,通过数据绑定和命令绑定来处理UI属性及事件驱动;同时,ViewModel中对属性的变更也会通知到View前端,让View前端实时更新。
MVVM中,各个部分的职责如下:
Model:负责数据实体的结构处理,与ViewModel进行交互;
View:负责界面显示,与ViewModel进行数据和命令的交互;


<Application x:Class="MvvmLightDemo.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:MvvmLightDemo"
xmlns:System="clr-namespace:System;assembly=mscorlib"
xmlns:vm="clr-namespace:MvvmLightDemo.ViewModel"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d"
StartupUri="LoadWindow.xaml">
<!--控件的顶级资源-->
<Application.Resources>
<ResourceDictionary>
<vm:ViewModelLocator x:Key="Locator" />
</ResourceDictionary>
</Application.Resources>
</Application>
<Window x:Class="MvvmLightDemo.LoadWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:MvvmLightDemo"
mc:Ignorable="d"
FontFamily="Arial"
FontSize="20"
WindowStyle="None"
Background="Transparent"
WindowStartupLocation="CenterScreen"
ResizeMode="NoResize"
<!--通过该句获取LoadViewModel示例-->
DataContext="{Binding Source={StaticResource Locator}, Path=LoadVM_Instance}"
Title="LoadWindow" Height="550" Width="700">
<Grid Margin="0">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"></RowDefinition>
<RowDefinition Height="1*"></RowDefinition>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Grid Grid.Row="1" Opacity="0.9" Grid.RowSpan="2">
<Border Grid.Column="1" Grid.Row="0" BorderBrush="DarkGray" BorderThickness="0 1 1 1" Panel.ZIndex="1">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="100"></RowDefinition>
<RowDefinition Height="1*"></RowDefinition>
</Grid.RowDefinitions>
<Grid Grid.Row="1">
<Grid.RowDefinitions>
<RowDefinition></RowDefinition>
<RowDefinition></RowDefinition>
<RowDefinition></RowDefinition>
<RowDefinition></RowDefinition>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"></ColumnDefinition>
<ColumnDefinition Width="1*"></ColumnDefinition>
<ColumnDefinition Width="1*"></ColumnDefinition>
</Grid.ColumnDefinitions>
<TextBlock Grid.Row="0" Grid.Column="0" Text="User Id:" FontFamily="Arial" FontSize="18" Foreground="#99F8F8F8" HorizontalAlignment="Right" VerticalAlignment="Center"></TextBlock>
<TextBlock Grid.Row="1" Grid.Column="0" Text="PassWord:" FontFamily="Arial" FontSize="18" Foreground="#99F8F8F8" HorizontalAlignment="Right" VerticalAlignment="Center"></TextBlock>
<TextBox Text="" x:Name="txtUserId" Grid.Row="0" Grid.Column="1" Grid.ColumnSpan="2" Margin="6 8 10 8" Style="{DynamicResource LoadingTextBoxStyle }"></TextBox>
<PasswordBox x:Name="txtPassWord" Grid.Row="1" Grid.Column="1" Grid.ColumnSpan="2" Margin="6 8 10 8" Style="{DynamicResource LoadingPasswordBoxStyle}"></PasswordBox>
<Button x:Name="StartUpdate" Command="{Binding UpdateCommand}" Grid.Row="2" Content="更新用户ID" FontSize="18" VerticalAlignment="Bottom" HorizontalAlignment="Stretch" Style="{DynamicResource ButtonStyle}" Margin="45.02,0,57.933,-4.625" Width="Auto" Height="26" Grid.ColumnSpan="2"/>
<Button x:Name="btnStopUpdate" Command="{Binding StopUpdateCommand}" Grid.Row="2" Content="停止更新ID" Grid.Column="2" FontSize="18" VerticalAlignment="Bottom" HorizontalAlignment="Stretch" Style="{DynamicResource ButtonStyle}" Margin="-18.744,0,38.327,-3.125" Width="Auto" Height="26" />
</Grid>
</Grid>
</Border>
</Grid>
</Grid>
</Window>
using GalaSoft.MvvmLight;
using GalaSoft.MvvmLight.Command;
using GalaSoft.MvvmLight.Messaging;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Threading; namespace MvvmLightDemo.ViewModel
{
public class LoadViewModel: ViewModelBase
{
private RelayCommand updateCommand; private RelayCommand stopUpdateCommand; private string userId; /// <summary>
/// 属性,用户ID
/// </summary>
public string UserId
{
get { return userId; }
// MvvmLight实现的Set方法,好处就是不用自己实现RaisePropertyChanged函数了,属性跟改后也可以通知到View端;
set { Set(ref userId, value); }
}
/// <summary>
/// 更新ID命令
/// </summary>
public RelayCommand UpdateCommand
{
set { updateCommand = value; }
get
{
if (updateCommand==null)
{
updateCommand = new RelayCommand(()=>ExecuteUpdate());
}
return updateCommand;
}
} /// <summary>
/// 停止更新ID命令
/// </summary>
public RelayCommand StopUpdateCommand
{
set { stopUpdateCommand = value; }
get
{
if (stopUpdateCommand==null)
{
stopUpdateCommand = new RelayCommand(()=>ExecuteStopUpdate());
}
return stopUpdateCommand;
}
} private void ExecuteStopUpdate()
{
//发送消息给View端
Messenger.Default.Send<string>("","StopUpdate");
} private void ExecuteUpdate()
{
//发送消息给View端
Messenger.Default.Send<string>(UserId, "Update");
} }
}
using GalaSoft.MvvmLight;
using GalaSoft.MvvmLight.Ioc;
using Microsoft.Practices.ServiceLocation;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace MvvmLightDemo.ViewModel
{
public class ViewModelLocator
{
public ViewModelLocator()
{
//所有的View都可以到Locator中找到自己需要的VM层,这个Locator相当于一个索引器
// Locator层返回的VM层是单例形式的,避免了由于代码问题导致的内存泄漏 ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);
if (ViewModelBase.IsInDesignModeStatic)
{
// 在Visual Studio中设计预览Xaml文件的时候,在这里注册会起作用;
SimpleIoc.Default.Register<LoadViewModel>();
}
else
{
// 在运行时,在这里注册会起作用;
SimpleIoc.Default.Register<LoadViewModel>();
} // 更多的时候,默认在这里注册就可以了;
SimpleIoc.Default.Register<LoadViewModel>();
} //返回一个LoadViewModel的实例,通过前端即xmal.cs获取
public LoadViewModel LoadVM_Instance
{
get
{
return ServiceLocator.Current.GetInstance<LoadViewModel>();
}
} public static void Cleanup()
{
// TODO Clear the ViewModels
}
}
}
using GalaSoft.MvvmLight.Messaging;
using MvvmLightDemo.Model;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
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.Shapes;
using System.Windows.Threading; namespace MvvmLightDemo
{
/// <summary>
/// LoadWindwo.xaml 的交互逻辑
/// </summary>
public partial class LoadWindow : Window
{
private DispatcherTimer timerUpdate = new DispatcherTimer();
public LoadWindow()
{
InitializeComponent();
Messenger.Default.Register<string>(this,"Update",UpdateMethod);
Messenger.Default.Register<string>(this,"StopUpdate",StopUpdateMethod);
} private void StopUpdateMethod(string obj)
{
MessageBox.Show("停止更新");
timerUpdate.Stop();
} private void UpdateMethod(string obj)
{
MessageBox.Show("开始更新");
timerUpdate.Start();
} private void LoginMethod(string obj)
{
btnLogin_Click(null,null);
} private void Title_Loaded(object sender, RoutedEventArgs e)
{
timerUpdate.Interval = TimeSpan.FromMilliseconds(500);
timerUpdate.Tick += new EventHandler(timerUpdate_Trick);
timerUpdate.Stop();
} private void timerUpdate_Trick(object sender, EventArgs e)
{
Random rand = new Random();
this.txtUserId.Text = rand.Next(1000).ToString();
} private void Title_Unloaded(object sender, RoutedEventArgs e)
{
timer.Stop();
} }
}

MvvmLight框架的基本使用的更多相关文章
- MVVMlight框架应用:Data Binding、Command
常用Wpf开发中我们在ViewModel中实现INotifyPropertyChanged接口,通过触发PropertyChanged事件达到通知UI更改的目的:在MVVMLight框架里,这里我们定 ...
- MvvmLight框架使用入门(一)
MvvmLight是比较流行的MVVM框架,相对较为简单易用.可能正因为简单,对应的帮助文档不多,对初学者就不够友好了.这里会用几篇随笔,就个人对MvvmLight的使用经验,来做一个入门的介绍. 第 ...
- 通过Nuget添加Mvvmlight框架发生错误
IDE:Visual Studio 2013 场景:通过Nuget添加Mvvmlight框架 具体错误: 解决办法:删除Nuget,然后添加新版本的Nuget Package Manager 具体操作 ...
- MvvmLight框架使用入门(四)
本篇我们着重介绍ViewModelBase,演示Set和RaisePropertyChanged方法的使用,以及就Cleanup方法释放资源展开讨论. ICleanup 接口.实现该接口的ViewMo ...
- MvvmLight框架使用入门(三)
本篇是MvvmLight框架使用入门的第三篇.从本篇开始,所有代码将通过Windows 10的Universal App来演示.我们将创建一个Universal App并应用MvvmLight框架. ...
- MvvmLight框架使用入门(二)
上一篇我们简单对MvvmLight做了介绍.罗列了三个DLL中,各个命名空间下主要类的定义及大致作用.因为只是范范的概论,对于从未接触过MvvmLight的萌新来说,根本就是在晃点他们.不过万事开头难 ...
- MvvmLight框架使用入门(5)
上一次写MvvmLight框架使用入门(4)的时候还在用Visual Studio 2015,我儿子也不会过来盖上我的XPS……重启这个系列一方面是因为最近又开始写UWP的东西了,另一个是因为Mvvm ...
- MVVMLight学习笔记(二)---MVVMLight框架初探
一.MVVM分层概述 MVVM中,各个部分的职责如下: Model:负责数据实体的结构处理,与ViewModel进行交互: View:负责界面显示,与ViewModel进行数据和命令的交互: View ...
- 在MVVMLight框架的ViewModel中实现NavigationService
网上已经有很多方法了,比如通过Messenger来实现等等.这里我只讲述一种我比较喜欢的方法,因为它很方便 首先定义一个ViewModel基类,将所有ViewModel子类继承这个基类.在基类中定义 ...
随机推荐
- JS中如何删除某个父元素下的所有子元素?
JS中如何删除某个父元素下的所有子元素?这里我介绍几种方法: 1.通过元素的 innerHTML 属性来删除 这种方式我觉得是最有方便的,直接找到你想要的父元素,直接令其 element.innerH ...
- OpenCV读写视频操作
一.读取视频流 在使用OpenCV读取摄像头,或者处理一些磁盘中保存的视频文件时,通常使用VideoCapture进行读取. std::string video_path("/path/to ...
- [报错]-RuntimeError: Input type (torch.cuda.HalfTensor) and weight type (torch.cuda.FloatTensor) should be the same
RuntimeError: Input type (torch.cuda.HalfTensor) and weight type (torch.cuda.FloatTensor) should be ...
- WSUS下载速度和BITS服务
近日,新装了一台WSUS服务器.选择好需要同步的补丁类型和语言版本后开始等待同步.通过过程异常缓慢,速度一直上不去.同步了一整天才30G,同步3T数据需要100天.这样肯定没办法用,所以要想办法提高下 ...
- 使用 Traefik 代理 UDP 服务
文章转载自:https://mp.weixin.qq.com/s?__biz=MzU4MjQ0MTU4Ng==&mid=2247488836&idx=1&sn=740f9aac ...
- 延申三大问题中的第三个问题处理---发布更新时先把服务从注册中心给down下来,等待一段时间后再能更新模块
一开始采取的思路大致如下: 在preStop中使用/bin/sh命令,先down 然后sleep一段时间, 这种思路的执行情况如下: 假若升级容器使用的镜像版本的话,先执行preStop中的命令,sl ...
- Spring Boot 使用 Micrometer 集成 Prometheus 监控 Java 应用性能
转载自:https://cloud.tencent.com/developer/article/1508319 文章目录1.Micrometer 介绍2.环境.软件准备3.Spring Boot 工程 ...
- 【BotR】CLR堆栈遍历(Stackwalking in CLR)
前言 在上一篇文章CLR类型系统概述里提到,当运行时挂起时, 垃圾回收会执行堆栈遍历器(stack walker)去拿到堆栈上值类型的大小和堆栈根.这里我们来翻译BotR里一篇专门介绍Stackwal ...
- P7361 「JZOI-1」拜神 (字符串)
题意: 给一个串,\(Q\) 次询问区间 \([l,r]\) 中至少出现两次的子串的最大长度. 写LCT是什么东东 以下做法很经典: 先求出 SA 以及 height 数组,然后按 height 从大 ...
- HDU4734 F(x) (数位DP)
(如此简短的题目给人一种莫名的压迫感......) 题目中定义一个数的权值求解函数:F(x) = An * 2n-1 + An-1 * 2n-2 + ... + A2 * 2 + A1 * 1. 观察 ...