[学习记号 - MVVM] 在ViewModel里设置Textbox焦点(focus)
2011-10-27 16:11
393 查看
问题:
设置输入框焦点Textbox.focus()本应该是View的事,为什么要放在ViewModel里设置?
情景假设:
登录模块中,用户输入用户名后,调用WCFRiaService异步验证用户名,如果用户存在,密码输入框自动获得焦点,否则出现指定错误信息。在此情景中,用户验证的业务逻辑应该在ViewModel里面,当业务完成且成功后需要就会涉及到设置Textbox焦点(focus)。
分析:
Textbox没有IsFocused属性,在此种情况下,可按以下思路考虑:首先加一个FocusBehavior,然后把ViewModel的属性UserNameValidated绑定到Textbox,当业务逻辑完成且成功了需要设置Textbox焦点(focus)时,用这个属性通知UI,同时用Behavior自动设置为聚焦(focus)。
实现:
1. 加一个Behavior,继承Behavior<FrameworkElement>
2. 在ViewModel里加属性UserNameValidated
3. 业务逻辑里面用户验证完成且成功后,需要设置Textbox聚焦(focus)时
4. 在Xaml里面绑定Textbox到这个属性和behavior,至此结束
原文参考:http://www.cnblogs.com/mainz/archive/2011/08/25/2153089.html
设置输入框焦点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] 在子窗体中给控件设置焦点(focus)
- WPF学习笔记:MVVM模式下,ViewModel如何关闭View?
- C# WPF MVVM 实战 – 5- 用绑定,通过 VM 设置 View 的控件焦点
- C# WPF MVVM 实战 – 5- 用绑定,通过 VM 设置 View 的控件焦点
- 迷你MVVM框架 avalonjs 学习教程2、模块化、ViewModel、作用域
- WPF学习笔记:MVVM模式下,ViewModel如何关闭View?
- WPF学习笔记:MVVM模式下,ViewModel如何关闭View?
- 关于在宿主activity中设置按钮,动态控制viewPager中的字体的大小的设置,在答题项目中遇到,在此做记录,方便日后学习,改进。
- JSP设计模式基础:View Helper模式——学习如何使用View Helper模式使得Model数据适应表现层的需要(2)
- Qt Model/View 学习笔记 (六)
- Qt Model/View 学习笔记 (五)
- MVVM:模型-视图-视图模型(Model-View-ViewModel)
- (转)Qt Model/View 学习笔记 (七)——Delegate类
- 从零开始学习 ASP.NET MVC 1.0 (四) View/Model 全解
- JavaScript(js)设置输入焦点(focus)
- MVVMLight源码分析之消息机制和ViewModelBase
- 从PRISM开始学WPF(五)MVVM(一)ViewModel?
- [MVVM Light] ViewModelBase
- Qt Model/View 学习笔记 (二):为使用Models与views热身
- 【django3】Django学习笔记3:Model,Template,View 基本概念