wp8使用mvvm模式简单例子(二)---登陆功能,事件触发
首先,还是需要一个Model类来为UI层的元素提供数据源
public class LoginModel:DependencyObject
{ public string Uid
{
get { return (string)GetValue(UidProperty); }
set { SetValue(UidProperty, value); }
} // Using a DependencyProperty as the backing store for Uid. This enables animation, styling, binding, etc...
public static readonly DependencyProperty UidProperty =
DependencyProperty.Register("Uid", typeof(string), typeof(LoginModel), null); public string Pwd
{
get { return (string)GetValue(PwdProperty); }
set { SetValue(PwdProperty, value); }
} // Using a DependencyProperty as the backing store for Pwd. This enables animation, styling, binding, etc...
public static readonly DependencyProperty PwdProperty =
DependencyProperty.Register("Pwd", typeof(string), typeof(LoginModel),null ); public ICommand LoginCmd
{
get
{
return new LoginCommand();
}
}
}
和一个继承ICommand接口的类LoginCommand
<pre name="code" class="csharp">public class LoginCommand:ICommand
{
public bool CanExecute(object parameter)
{
return true;
} public void Execute(object parameter)
{
LoginModel login = (LoginModel) parameter;
if (login.Uid == "admin" && login.Pwd == "111")
{
MessageBox.Show("ok");
}
else
{
MessageBox.Show("error");
}
} public event EventHandler CanExecuteChanged;
}
然后为前台的UI元素绑定数据源:
<Grid x:Name="ContentPanel" Grid.Row="1" Margin="14,10,10,-10" Grid.ColumnSpan="2" DataContext="{StaticResource loginModel}">
<TextBox Name="txtUid" Text="{Binding Uid,Mode=TwoWay}" HorizontalAlignment="Left" Height="72" Margin="115,35,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="224"/>
<TextBox Name="txtPwd" Text="{Binding Pwd,Mode=TwoWay}" HorizontalAlignment="Left" Height="72" Margin="115,138,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="224"/>
<TextBlock Text="账号:" HorizontalAlignment="Left" Margin="28,60,0,0" TextWrapping="Wrap" VerticalAlignment="Top" RenderTransformOrigin="-0.146,-0.259"/>
<TextBlock Text="密码:" HorizontalAlignment="Left" Margin="28,163,0,0" TextWrapping="Wrap" VerticalAlignment="Top" RenderTransformOrigin="-0.146,-0.259"/>
<Button Content="登陆" Command="{Binding LoginCmd}" CommandParameter="{Binding}" HorizontalAlignment="Left" Margin="28,246,0,0" VerticalAlignment="Top"/>
</Grid>
这样看起来似乎没有任何问题
启动调试,点击按钮进行判断,完美运行
但是肯定是有地方不对劲
那到底是哪里的问题?
仔细想想mvvm的原则
在xaml.cs后台不直接操作UI元素
Model提供数据源
UI元素绑定数据源
LoginCommand的Execute方法进行业务逻辑处理
其实在前面的Execute方法的业务处理代码中已经违反了mvvm的规定
public void Execute(object parameter)
{
LoginModel login = (LoginModel) parameter;
if (login.Uid == "admin" && login.Pwd == "111")
{
MessageBox.Show("ok");
}
else
{
MessageBox.Show("error");
}
}
这里只能写逻辑处理的代码
不能有控制UI的部分
上面这么写就相当于asp.net的三层中在Bll层突然来了个Response.Redirect一样
这很明显是不允许的!
那么要如何修改呢?
首先
既然对MessageBox明确了不能出现在这里
那么只能在xaml.cs后台文件中进行处理了
那么后台又不能包含有任务业务处理的代码
他怎么才能知道什么时候要Show一下信息,然后Show什么信息呢?
这就要用到一个事件机制了
先定义一个委托
public delegate void LoginResult(bool success);
然后在LoginModel中定义一个事件
public event LoginResult LoginCompelete;
在后台页面加载的事件中对该事件添加方法
private void PhoneApplicationPage_Loaded(object sender, RoutedEventArgs e)
{
LoginModel model = (LoginModel)this.Resources["loginModel"];
model.LoginCompelete += new LoginResult(model_LoginCompelete);
} void model_LoginCompelete(bool success)
{
if (success)
{
MessageBox.Show("ok!");
}
else
{
MessageBox.Show("error!");
}
}
而这时,LoginCommand的Execute方法就需要进行修改了
既然在页面加载的时候 就已经为LoginModel的LoginCompelete事件添加完了显示MessageBox的方法
那么在Execute中需要做的事情就只是 判断用户的账号密码
然后根据结果触发这个事件就ok了
但是因为事件本质是一个私有的委托+add和remove两个属性
所以该事件只能在内部被触发
所以在LoginModel中需要提供一个方法,让外界能够通过该方法触发LoginCompelete事件
public void FirLoginCompelete(bool success)
{
if (LoginCompelete != null)
{
LoginCompelete(success);
}
}
之后就可以再Execute方法中方便的触发事件了
public void Execute(object parameter)
{
LoginModel login = (LoginModel) parameter;
if (login.Uid == "admin" && login.Pwd == "111")
{
login.FirLoginCompelete(true);
}
else
{
login.FirLoginCompelete(false);
}
}
修改完成!
wp8使用mvvm模式简单例子(二)---登陆功能,事件触发的更多相关文章
- wp8使用mvvm模式简单例子
mvvm是silverlight/wpf下的mvc升华 通过一个简单的加法计算器例子来说明mvvm是什么 在设计界面完成设计之后,显示简单的布局,如下图: 然后来比较,传统的直接方式,mvc和mvvm ...
- WPF中在MVVM模式下,后台绑定ListCollectionView事件触发问题
问题:WPF中MVVM模式下 ListView绑定ListCollectionView时,CurrentChanged无法触发 解决方案: 初期方案:利用ListView的SelectionChang ...
- Xamarin.Android和UWP之MVVM的简单使用(二)
0x01 前言 前面一篇,Xamarin.Android和UWP之MVVM的简单使用(一),主要讲了MvvmLight的简单使用 这篇主要讲讲MvvmCross的简单使用,例子的话,还是和上篇的一样. ...
- MVC模式和MVVM模式简单理解
相信这是两个耳熟能详的词了,MVC广泛的用到了java的各种框架当中,比如Struts2, SpringMVC等,作为B/S架构开发,MVS模式也是我们必须掌握的. mvc一步一步演化之后有了现在的M ...
- 简单例子了解View的事件分发
什么是事件分发 我们在写自定义ViewGroup或者自定义View的时候经常要处理用户的点击事件,如果我们的View在最底层,他在很多ViewGroup里面,我们如何让我们的点击事件准确传递到View ...
- epoll水平/边缘触发模式下阻塞/非阻塞EPOLLOUT事件触发条件及次数
在IO多路复用技术中,epoll默认的事件触发模式为Level_triggered(水平触发)模式,即当被监控的文件描述符上有可读/写事件发生时,epoll_wait()会通知处理程序去读写.如果这次 ...
- [原][osg][QT]osg与QT界面结合的简单例子二
//main.cpp #include "VREObliqueEditorQTWindow.h" #include <QtWidgets/QApplication> # ...
- WPF WebBrowser+TabControl MVVM模式 简单应用 提供源码下载
源代码下载 这个程序是TabControl和Webbrowser的练手小程序 可达到练手目的有: MVVM设计模式的基本使用 Binding(包括相对源[RelativeSource]绑定)的基本使用 ...
- WPF Prism框架下基于MVVM模式的命令、绑定、事件
Prism框架下的自定义路由事件和命令绑定 BaseCode XAML代码: <Button x:Class="IM.UI.CommandEx.PrismCommandEx" ...
随机推荐
- SPOJ 1825 Free Tour | 终极之树分治
求树上最长路径使得经过的拥挤节点个数不超过K //欢迎访问这个博客!http://www.cnblogs.com/luyouqi233/p/8036828.html #include<cstdi ...
- Avito Cool Challenge 2018:C. Colorful Bricks
C. Colorful Bricks 题目链接:https://codeforces.com/contest/1081/problem/C 题意: 有n个横向方块,一共有m种颜色,然后有k个方块的颜色 ...
- CI的多级目录的功能
https://segmentfault.com/q/1010000008317555?_ea=1621531
- bzoj4418 [Shoi2013]扇形面积并
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=4418 [题解] 被题目名称吓死系列. 用一棵线段树维护当前有哪些半径. 那么将扇形差分,每段 ...
- hdu 6114 百度之星复赛B T1
Chess Problem Description 車是中国象棋中的一种棋子,它能攻击同一行或同一列中没有其他棋子阻隔的棋子. 一天,小度在棋盘上摆起了许多車……他想知道,在一共N×M个点的矩形棋盘中 ...
- 【IDEA】IDEA集成Tomcat7插件运行项目
Maven已经是Java的项目管理标配,如何在JavaEE开发使用Maven调用Web应用,是很多同学关心的问题.本文将介绍,Maven如何介绍Tomcat插件. Maven Tomcat插件现在主要 ...
- 转载: CentOS/Linux 解决 SSH 连接慢
CentOS/Linux 解决 SSH 连接慢 现在连接Linux服务器一般都是使用SSH远程连接的方式.最近新装了一台服务器,发现telnet时速度很快,ping时一切也正常,但SSH连接的时候却很 ...
- Access数据库 INSERT INTO 失败
一次操作Access数据库,插入一条数据,总是失败,如下: 通过赋值,一个字段一个字段的排查,最终确定是UserAge字段处有问题. 最初,UserAge字段是 %d 类型的,赋值20,可成功插入数据 ...
- kvm qemu内幕介绍
转自:http://blog.csdn.net/wj_j2ee/article/details/7978259目录 1 硬件虚拟化技术背景 2 KVM的内部实现概述 2.1 KVM的抽象对象 2.2 ...
- 配置和读取INI
#define MAX_FILE_PATH 260 void CControlDlg::OnBnClickedBtnGamepath() { // TODO: 在此添加控件通知处理程序代码 CFile ...