前言
现在的场景是有两个窗口展示,一个是主窗口,一个是子窗口,子窗口在查找出音乐专辑后,选中其中一张音乐专辑,点击购买,添加到主窗口并展示,即跨窗口传递数值,官方文档用的是ReactiveUI 框架的ReactiveCommand响应式命令绑定实现,不过我项目采用的是 Community Toolkit MVVM,想着用它实现一下,现在想到且实现了就两种方式,一个是依赖注入,一个是消息传递,如果有其它方式,欢迎小伙伴们留言讨论,让我也学习一下,先看效果图
Avalonia跨窗口交互
1、消息传递
简单来说就是发送消息与订阅消息
- 在搜索音乐专辑的视图ViewModel中,选中其中一个专辑,点击购买保存按钮,触发
点击事件发送消息
,并携带音乐专辑
这个实体类数据
[RelayCommand]
void BuyMusic()
{
if (SelectedAlbum != null)//选中的音乐
{
WeakReferenceMessenger.Default.Send(SelectedAlbum, "buyMusic");//发送消息
}
}
注意:buyMusic
这个参数代表token令牌,表示监听(订阅)该消息时须带上一样的token令牌才能验证接收消息。
- 在主窗口的ViewModel类注册消息,用来接收消息的发送
public partial class MainWindowViewModel : ViewModelBase
{
//主窗口音乐专辑集合
[ObservableProperty]
private ObservableCollection<AlbumViewModel> albums;
public MainWindowViewModel()//构造函数
{
RegisterMessages();//注册消息
}
private void RegisterMessages()
{
var token = "buyMusic";
//注册监听消息
WeakReferenceMessenger.Default.Register<AlbumViewModel, string>(this, token, (r, m) =>
{
Albums.Add(m);//将传递的数据添加到主窗口的音乐专辑集合属性中
});
}
}
2、依赖注入
- 需要先在项目使用Nuget安装
Microsoft.Extensions.Dependencylnjection
库,用来管理依赖注入,然后在App.xaml.cs
中的OnFrameworkInitializationCompleted
方法注入音乐专辑集合数据(这里是单例)
public override void OnFrameworkInitializationCompleted()
{
ServiceCollection collection = new ServiceCollection();
//注入 ObservableCollection<AlbumViewModel>
collection.AddSingleton<ObservableCollection<AlbumViewModel>>();
// 从 collection 提供的 IServiceCollection 中创建包含服务的 ServiceProvider
var services = collection.BuildServiceProvider();
Ioc.Default.ConfigureServices(services);
//其它代码省略...
}
- 在点击购买音乐专辑后,获取注入的集合数据实例,添加选中的音乐专辑
[RelayCommand]
void BuyMusic()
{
if (SelectedAlbum != null)//选中的音乐
{
//获取IOC容器的音乐专辑集合实例
ObservableCollection<AlbumViewModel> albums = Ioc.Default.GetRequiredService<ObservableCollection<AlbumViewModel>>();
//添加音乐专辑
albums.Add(SelectedAlbum);
}
}
- 在主窗口的ViewModel类的构造函数,为属性数据指向为IOC注入的数据
public partial class MainWindowViewModel : ViewModelBase
{
//主窗口音乐专辑集合
[ObservableProperty]
private ObservableCollection<AlbumViewModel> albums;
public MainWindowViewModel()//构造函数
{
//为属性指向IOC注入的音乐专辑集合实例
Albums = Ioc.Default.GetRequiredService<ObservableCollection<AlbumViewModel>>();
}
}
注意: 通过对字段使用ObservableProperty
特性,会自动在 ViewModel 中创建属性,当这些属性的值发生变化时,会自动通知订阅者,比如界面元素,从而实现数据的自动更新。