MVVMLight页面间传递消息
场景
- 两个页面之间传递数据,我们这里演示一个文本框的内容点击发送在第二个页面上显示
操作
- 新建一个接收页面,并添加一个text用来显示接收的消息
<Grid>
<TextBlock Text="{Binding Msg}"></TextBlock>
</Grid>
- 添加窗口对应的ViewModel
public class Window1ViewModel : ViewModelBase
{
public Window1ViewModel()
{
Messenger.Default.Register<string>(this, MessageToken.SendMessageToken, (msg) =>
{
Msg = msg;
});
}
private string _msg;
public string Msg
{
get
{
return _msg;
}
set
{
_msg = value;
RaisePropertyChanged(() => Msg);
}
}
}
- 添加对应的消息类型参数
public static class MessageToken
{
/// <summary>
/// 动画信息标志
/// </summary>
public static readonly string AnimateMessageToken;
/// <summary>
/// 发送消息标志
/// </summary>
public static readonly string SendMessageToken;
static MessageToken()
{
AnimateMessageToken = nameof(AnimateMessageToken);
SendMessageToken = nameof(SendMessageToken);
}
}
- 为窗口关联ViewModel
//在locator添加viewModel
SimpleIoc.Default.Register<Window1ViewModel>();
public Window1ViewModel View1
{
get
{
return ServiceLocator.Current.GetInstance<Window1ViewModel>();
}
}
- 之后绑定两者之间的关系
DataContext="{Binding Source={StaticResource Locator},Path=View1}"
- 在主窗口上添加控件和命令
<TextBox Text="{Binding Msg}" Width="100" Height="30" Margin="86,10,331,120"></TextBox>
<Button Width="100" Height="30" Grid.Row="1" Content="Send" Command="{Binding SendCommand}"></Button>
- 主窗口对应的操作
SendCommand = new RelayCommand(() =>
{
Messenger.Default.Send<string>(Msg, MessageToken.SendMessageToken);
});
提示
- 流程就是新建窗口,添加ViewModel ,关联View 和ViewMoel,添加添加对应的操作方法,不会可以参考上一文章
- 消息令牌是可以自己定义的,尽量有意思,UI和ViewModel沟通一下。
- 页面间如果有大量的数据传递,一定要用Model和DB,一个页面存在一个地方的数据,只要用页面间通知有消息到达并告诉去那里去取数。这种令牌其实是基于消息通讯的。
源码
经常遇到官方说这是一个独木桥,尽量不要过太多的人。但是有很多人却喜欢在这上面通过整个军队,你说你的软件不出问题还有天理吗?合理的设计和合理的使用。我还遇到过在动态库里要求添加线程的要求,封个库还要添加线程,那别人调的时候肯定要考虑线程,万一调用者不考虑就会说库出了问题,如果调用者不开线程,就会说你的库性能不高。大家教我如何出这个坑呢?
MVVM Light 消息传递
本文介绍如何在两个MVVM Light页面间传递文本数据。通过注册消息令牌、设置ViewModel和View绑定,实现从一个页面发送文本到另一个页面显示的功能。
305

被折叠的 条评论
为什么被折叠?



