1.创建事件UpdateLoadingEvent
继承PubSubEvent类,并传入一个对象泛型
PubSubEvent:维护订阅者列表并向订阅者发送事件。
public class UpdateModel {
public bool IsOpen { get; set; }
}
class UpdateLoadingEvent : PubSubEvent<UpdateModel>
{}
2.创建订阅和发布类
通过构造注入IEventAggregator,并通过IEventAggregator的GetEvent获取定义的消息,再通过Subscribe方法注册;UpdateModel动态地获取前台传过来的值
转载:EventAggregator 是基于事件聚合器服务,允许发布者和订阅者之间通过事件进行通讯,且彼此之间没有直接引用。
public static class DialogExtensions
{
public static void Resgiter(this IEventAggregator aggregator, Action<UpdateModel> action)
{//订阅;Subscribe是一个委托方法
aggregator.GetEvent<UpdateLoadingEvent>().Subscribe(action);
}public static void UpdateLoading(this IEventAggregator aggregator, UpdateModel model)
{//发布
aggregator.GetEvent<UpdateLoadingEvent>().Publish(model);
}}
3.动画view
<StackPanel Width="100">
<ProgressBar Width="40" Height="40" Margin="20"
IsIndeterminate="True"//MaterialDesignThemes下的样式,需在包管理器下安装
Style="{StaticResource MaterialDesignCircularProgressBar}"
/>
</StackPanel>
4.实现目标view的下订阅
public MainView(IEventAggregator aggregator)
{
InitializeComponent();
aggregator.Resgiter(arg =>
{//在目标view中根组件x:names=“DialogHost”
DialogHost.IsOpen = arg.IsOpen;if (DialogHost.IsOpen)
DialogHost.DialogContent = new ProgressView();
});}
5.实现目标viewmodel继承的基类
(因为要进行页面的跳转,而目标viewmodel不能同时有两个基类)
INavigationAware:页面时导入参数
IContainerProvider :抽象第三方IOC框架从容器中拿对象
public class NavigationViewModel : BindableBase, INavigationAware
{
private readonly IContainerProvider containerProvider;
private readonly IEventAggregator aggregator;
public NavigationViewModel(IContainerProvider containerProvider)
{
this.containerProvider = containerProvider;
aggregator = containerProvider.Resolve<IEventAggregator>();
}
public virtual bool IsNavigationTarget(NavigationContext navigationContext)
{
return true;
}public virtual void OnNavigatedFrom(NavigationContext navigationContext)
{ }public virtual void OnNavigatedTo(NavigationContext navigationContext)
{ }
public void UpdateLoading(bool IsOpen)
{//更新指定的模型实例
aggregator.UpdateLoading(new Common.Events.UpdateModel()
{
IsOpen = IsOpen
});
}
}
6.实现目标viewmodel
public class AViewModel: NavigationViewModel{
public AViewModel(IContainerProvider provider)
: base(provider){
GetDataAsync();
}
async void GetDataAsync()
{
UpdateLoading(true);///数据导入代码(省略)
UpdateLoading(false);
}public override void OnNavigatedTo(NavigationContext navigationContext)
{
base.OnNavigatedTo(navigationContext);GetDataAsync();
}}