MVVMLight已经停止维护,可以考虑MVVMToolkit来替代,MVVMToolkit官方文档两个框架的基本使用方法类似,下面介绍一下不同之处(建议先看上篇介绍MVVMLight的文章)。
MVVMToolkit是一个现代、快速且模块化的 MVVM 库。 它是 .NET 社区工具包的一部分,
平台和运行时独立 - .NET Standard 2.0、 .NET Standard 2.1 和 .NET 6。易于选取和使用,没有严格的要求,灵活使用。
Messenger
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| WeakReferenceMessenger.Default.Send<string>("hello");
WeakReferenceMessenger.Default.Register<string>(this, DoMessage);
WeakReferenceMessenger.Default.Register<MessageObject>(this, DoMessage);
this.IsActive = true; public void Receive(string message) { }
|
IoC
仿照MVVMLight,新建ViewModelLocator
类。
需要nuget安装Microsoft.Extensions.DependencyInjection
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| 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
1 2 3
| <Application.Resources> <vm:ViewModelLocator x:Key="Locator" /> </Application.Resources>
|
window.xaml中使用
DataContext="{Binding Source={StaticResource Locator},Path=Main}"
AsnycRelayCommand
异步命令
1 2 3 4 5 6 7 8
| public ICommand BtnCommand { set; get; }
BtnCommand = new AsyncRelayCommand(DoCommand); private async Task<String> DoCommand() { await Task.Delay(3000); return "hello"; }
|
如果在页面要获取异步命令的返回值,需要做一个转换
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| public class TaskResultConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { if (value is Task task) { return task.GetResultOrDefault(); } return null; }
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { throw new NotImplementedException(); } }
|
页面
1 2 3 4 5
| <Window.Resources> <local:TaskResultConverter x:Key="taskResult" /> </Window.Resources> <TextBlock Text="{Binding BtnCommand.ExecutionTask, Converter={StaticResource taskResult}}" /> <Button Command="{Binding BtnCommand}" Content="OK" />
|