关键字:WPF .Net C# MVVM Light Toolkit 框架 Visual Studio 2010 VS2010 Expression Blend 4 入门 教程 新手 实践
七、Messenger
一个用户体验良好的登录界面应该能够记录最后一次登录的用户ID以避免无意义的重复输入。为了实现这个功能,我将继续对上一篇的登录页面进行加工。
1、在LoginViewModel.cs中,再添加一个RelayCommand类型的属性LoadedCommand作为响应View层页面载入完成事件的Command对象,并在构造函数中对其进行初始化(PageLoaded()方法里涉及的两个MoveInputFocusTo方法的具体实现稍后详述)。
2、在Blend 4中,从“资产”页签的列表中选择“行为”,将“EventToCommand”拖拽到[Page]上,把默认名称改为PageLoaded。
3、将PageLoaded的Command属性绑定到LoadedCommand(注意“属性”页签中“触发器”一栏的EventName要选择Loaded),如下两图所示。
4、假设作为Model的User类中有一个LoadLastLoginInfo()方法会在每次构造新的User对象时从配置文件中读取上一次成功登录的用户ID,那么作为View层的LoginPage就需要根据用户ID的输入框是否有值来决定输入焦点究竟是应该落在用户ID输入框还是密码输入框。可是不论哪种输入框,都没有一个可以用来绑定到ViewModel层的属性来标识该元素应当获得输入焦点。如果想这么做,必须要调用该元素的Focus()方法。问题出现了:我不想让ViewModel层知道是哪种界面元素需要获得输入焦点。为了避免View层和ViewModel层的耦合太紧,我需要用MVVM Light Toolkit的Messenger来解除它们之间的强引用。首先,创建一个新的类MoveLoginInputFocusMessage,其中包含一个string类型的属性InputFieldName。
5、在LoginViewModel.cs中,实现PageLoaded()方法里涉及的两个MoveInputFocusTo方法(消息发送者)。
6、在LoginPage.xaml.cs中,修改LoginPage的构造函数,注册消息接收者并提供MoveLoginInputFocus()方法作为具体实现。
编译通过。