Avalonia + Community Toolkit MVVM实现跨窗口数据交互

前言

现在的场景是有两个窗口展示,一个是主窗口,一个是子窗口,子窗口在查找出音乐专辑后,选中其中一张音乐专辑,点击购买,添加到主窗口并展示,即跨窗口传递数值,官方文档用的是ReactiveUI 框架的ReactiveCommand响应式命令绑定实现,不过我项目采用的是 Community Toolkit MVVM,想着用它实现一下,现在想到且实现了就两种方式,一个是依赖注入,一个是消息传递,如果有其它方式,欢迎小伙伴们留言讨论,让我也学习一下,先看效果图

Avalonia跨窗口交互


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 中创建属性,当这些属性的值发生变化时,会自动通知订阅者,比如界面元素,从而实现数据的自动更新。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值