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;
publicvoidReceive(stringmessage)
{
//凡是相应类型的都可以收到信息
//如何实现精准接收,要自定义一个类
}
IoC
仿照MVVMLight,新建ViewModelLocator
类。
需要nuget安装Microsoft.Extensions.DependencyInjection
publicclassViewModelLocator
{
publicstaticIServiceProviderserviceProvider { get; privateset; }
publicViewModelLocator()
{
serviceProvider=GetService();
}
privateIServiceProviderGetService()
{
//实例化容器对象
varservice=newServiceCollection();
//注册项目需要的对象
service.AddSingleton<MainViewModel>();
returnservice.BuildServiceProvider();
}
publicMainViewModelMain
{
get=>serviceProvider.GetService<MainViewModel>();
}
}
App.xmal
<Application.Resources>
<vm:ViewModelLocatorx:Key="Locator"/>
</Application.Resources>
window.xaml中使用
DataContext="{Binding Source={StaticResource Locator},Path=Main}"
AsnycRelayCommand
异步命令
publicICommandBtnCommand { set; get; }
//异步命令必须在构造方法中创建
BtnCommand=newAsyncRelayCommand(DoCommand);
privateasyncTask<String>DoCommand()
{
awaitTask.Delay(3000);
return"hello";
}
如果在页面要获取异步命令的返回值,需要做一个转换
publicclassTaskResultConverter : IValueConverter
{
publicobjectConvert(objectvalue, TypetargetType, objectparameter, CultureInfoculture)
{
if (valueisTasktask)
{
// 安装了Microsoft.Toolkit
returntask.GetResultOrDefault();
}
returnnull;
}
publicobjectConvertBack(objectvalue, TypetargetType, objectparameter, CultureInfoculture)
{
thrownewNotImplementedException();
}
}
页面
<Window.Resources>
<local:TaskResultConverterx:Key="taskResult"/>
</Window.Resources>
<TextBlockText="{Binding BtnCommand.ExecutionTask, Converter={StaticResource taskResult}}"/>
<ButtonCommand="{Binding BtnCommand}"Content="OK"/>