MVVMToolkit入门教程

举报
步步为营 发表于 2023/02/21 14:29:31 2023/02/21
【摘要】 MVVMLight已经停止维护,可以考虑MVVMToolkit来替代,MVVMToolkit官方文档两个框架的基本使用方法类似,下面介绍一下不同之处(建议查看一下上一篇关于MVVMLight的文章)。

MVVMToolkit

MVVMLight已经停止维护,可以考虑MVVMToolkit来替代,MVVMToolkit官方文档两个框架的基本使用方法类似,下面介绍一下不同之处。

Messenger

//发送
WeakReferenceMessenger.Default.Send<string>("hello");

//注册1
WeakReferenceMessenger.Default.Register<string>(this, DoMessage);
//注册2
WeakReferenceMessenger.Default.Register<MessageObject>(this, DoMessage);
//注册3,不需要Register
//类的继承,使用ObservableRecipient替换ObservableObject,并继承IRecipient接口
//用来接收消息,这样就不需要注册
//必须打开消息开关
this.IsActive = true;
public void Receive(string message)
{
   //凡是相应类型的都可以收到信息
   //如何实现精准接收,要自定义一个类
}

IoC

仿照MVVMLight,新建ViewModelLocator类。

需要nuget安装Microsoft.Extensions.DependencyInjection

public class ViewModelLocator
 {
     public static IServiceProvider serviceProvider { get; private set; }
     public ViewModelLocator()
     {
         serviceProvider = GetService();
     }

    private IServiceProvider GetService()
     {
         //实例化容器对象
         var service = new ServiceCollection();

         //注册项目需要的对象

         service.AddSingleton<MainViewModel>();
         return service.BuildServiceProvider();
     }

     public MainViewModel Main
     {
         get => serviceProvider.GetService<MainViewModel>();
     }
 }

App.xmal

<Application.Resources>
    <vm:ViewModelLocator x:Key="Locator" />
</Application.Resources>

window.xaml中使用

DataContext="{Binding Source={StaticResource Locator},Path=Main}"

AsnycRelayCommand

异步命令

public ICommand BtnCommand { set; get; }
//异步命令必须在构造方法中创建
BtnCommand = new AsyncRelayCommand(DoCommand);
private async Task<String> DoCommand()
{
    await Task.Delay(3000);
    return "hello";
}

如果在页面要获取异步命令的返回值,需要做一个转换

public class TaskResultConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value is Task task)
        {
            //  安装了Microsoft.Toolkit
            return task.GetResultOrDefault();
        }
        return null;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

页面

<Window.Resources>
    <local:TaskResultConverter x:Key="taskResult" />
</Window.Resources>
<TextBlock Text="{Binding BtnCommand.ExecutionTask, Converter={StaticResource taskResult}}" />
<Button Command="{Binding BtnCommand}" Content="OK" />
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。