这一篇实现MVVMLight 消息机制
WPF 中实现View 与ViewMode 之间的通信
比如 我们实现 Main窗体 在点击新增的时候 或者修改的时候 实现Show出一个窗体 点击修改的时候并把选中的值传入修改窗体
首先MVVMlight 里的Messenger 来实现发送消息 与消息的注册
先定义一个类EditBookArgs 这个类是拿来传参的 比如 传入 编辑窗体(一般新增和编辑窗体为一个窗体) 的对象
IsEdit 是来区分点击的是编辑窗体还是新增窗体
public class EditBookArgs
{
private bool isEdit;
public bool IsEdit
{
get { return isEdit; }
set { isEdit = value; }
}
private Book book;
public Book Book
{
get { return book; }
set { book = value; }
}
}
在MainViewModel中 发送消息
private void edit(Book obj)
{
Messenger.Default.Send(new EditBookArgs { Book = obj, IsEdit = true });
}
private void add()
{
Messenger.Default.Send(new EditBookArgs {IsEdit = false });
}
在Mainwindow 里 注册消息
public MainWindow()
{
InitializeComponent();
Messenger.Default.Register<EditBookArgs>(this, Onmake);
this.Unloaded += MainWindow_Unloaded;
}
void MainWindow_Unloaded(object sender, RoutedEventArgs e)
{
Messenger.Default.Unregister<EditBookArgs>(this, Onmake);
}
private void Onmake(EditBookArgs obj)
{
EditBookwindow window = new EditBookwindow();
// (window.DataContext as IeditBook).EditBookArgs = obj;
var result= window.ShowDialog();
if (result.HasValue && result.Value)
{
}
}
在这里说一下代码意思
我们Main窗体注册了一个消息 在MainViewModel 里用触发事件 发送消息 用send来发送消息内容
现在我们 在界面获得了 参数 也可以new一个Edit窗体 我们怎么把参数传入Edit那 一种在Edit窗体 定义一个对象
但是这样会让程序耦合 这里做一个接口
EditViewModel 继承这个接口 在EditViewModel里就可以随意使用 接口对象 来对Edit里面的对象赋值
public interface IeditBook
{
EditBookArgs EditBookArgs { get; set; }
}
EditBookViewModel 里面有一个显示 relayCommand
private void viewl()
{
if (EditBookArgs.IsEdit)
{
CurrentBook = new Book
{
Id = EditBookArgs.Book.Id,
Author = EditBookArgs.Book.Author,
Description = EditBookArgs.Book.Description,
Pages = EditBookArgs.Book.Pages,
Title = EditBookArgs.Book.Title
};
}
else
{
CurrentBook = new Book { Id = Guid.NewGuid() };
}
WindowTitle = EditBookArgs.IsEdit ? "编辑" : "新增";
}
看不懂 没关系 我最后会把代码传到最后一篇MVVMlight文章里