[学习记号 - MVVM] 在ViewModel里设置Textbox焦点(focus)
来源:互联网 发布:js input只能输入数字 编辑:程序博客网 时间:2024/05/22 18:15
问题:
设置输入框焦点Textbox.focus()本应该是View的事,为什么要放在ViewModel里设置?
情景假设:
登录模块中,用户输入用户名后,调用WCFRiaService异步验证用户名,如果用户存在,密码输入框自动获得焦点,否则出现指定错误信息。在此情景中,用户验证的业务逻辑应该在ViewModel里面,当业务完成且成功后需要就会涉及到设置Textbox焦点(focus)。
分析:
Textbox没有IsFocused属性,在此种情况下,可按以下思路考虑:首先加一个FocusBehavior,然后把ViewModel的属性UserNameValidated绑定到Textbox,当业务逻辑完成且成功了需要设置Textbox焦点(focus)时,用这个属性通知UI,同时用Behavior自动设置为聚焦(focus)。
实现:
1. 加一个Behavior,继承Behavior<FrameworkElement>
using System.Windows;using System.Windows.Controls;using System.Windows.Interactivity;namespace TestSLApplication{ public class PasswordboxFocusBehavior : ControlFocusBehaviorBase<PasswordBox> { } public class TextBoxFocusBehavior : ControlFocusBehaviorBase<TextBox> { } public class ControlFocusBehaviorBase<T> : Behavior<FrameworkElement> where T : Control { public static readonly DependencyProperty IsFocusedProperty = DependencyProperty.RegisterAttached( "IsFocused", typeof(bool), typeof(ControlFocusBehaviorBase<T>), new PropertyMetadata(IsFocusedPropertyChanged)); private static void IsFocusedPropertyChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs e) { var p = dependencyObject as T; if (p == null) return; if ((e.NewValue is bool ? (bool)e.NewValue : false)) { p.Focus(); } } public static bool GetIsFocused(T p) { return p.GetValue(IsFocusedProperty) is bool ? (bool)p.GetValue(IsFocusedProperty) : false; } public static void SetIsFocused(T p, bool value) { p.SetValue(IsFocusedProperty, value); } }}
2. 在ViewModel里加属性UserNameValidated
private bool userNameValited;public bool UserNameValidated{ get { return userNameValited; } set { userNameValited = value; if (notifyPropertyChanged != null) notifyPropertyChanged("UserNameValidated"); }}
3. 业务逻辑里面用户验证完成且成功后,需要设置Textbox聚焦(focus)时
UserNameValidated = true;
4. 在Xaml里面绑定Textbox到这个属性和behavior,至此结束
<PasswordBox Name="YourBox" beh:PasswordboxFocusBehavior.IsFocused="{Binding UsernameValidated}" />
原文参考:http://www.cnblogs.com/mainz/archive/2011/08/25/2153089.html
- [学习记号 - MVVM] 在ViewModel里设置Textbox焦点(focus)
- [学习记号 - MVVM] 在子窗体中给控件设置焦点(focus)
- WPF MVVM(Model-View-ViewModel)设计模式【学习】
- jQuery dialog设置focus焦点
- 设置Textbox焦点位置
- mvvm 绑定textbox焦点丢失问题
- 设置DataGridView的某行为焦点(类似Focus属性)
- MVVM(Model-View-ViewModel)实例讲解
- MVVM(Model-View-ViewModel)实例讲解
- Win8 在TextBox中设置提示信息,当TextBox获得焦点时消失,失去时验证
- JavaScript(js)设置默认输入焦点(focus)
- 用 focus 获取焦点并设置样式
- 设置控成为焦点(Focus)和设置WebForm窗体默认按钮(Default Button)
- WPF学习笔记:MVVM模式下,ViewModel如何关闭View?
- Silverlight 4里Textbox在失去焦点之前无法获取到Text值的另类解决方法
- MVVM 模式 ViewModel
- MVVM 集合的ViewModel
- Android MVVM ViewModel
- 8个Expression Blend4的快捷键
- Extjs文件小介绍
- 将vs2008 项目 转换成到2005 下的解决方法
- AS3与数据结构
- aspx网页 回车触发button控件
- [学习记号 - MVVM] 在ViewModel里设置Textbox焦点(focus)
- 在html中插入常用视频文件的代码
- 精通 JS正则表达式二
- memset函数不能给int(整型)数组初始化赋值
- servlet中的cookie和session问题小结
- Source Insight的几个经典用法
- Xming X Server 配置和使用
- 配置实现-列表页面配置使用
- 字符,字节和编码(转)