MVVMToolkit入门教程
【摘要】 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)