WPF入门教程Prism框架使用
Prism是一个框架,用于在WPF和Xamarin Forms中构建松散耦合、可维护和可测试的XAML应用程序。每个平台都有单独的版本,这些版本将在独立的时间表上开发。Prism提供了一组设计模式的实现,这些设计模式有助于编写结构良好且可维护的XAML应用程序,包括MVVM、依赖注入、命令、EventAggregator等。
ICommand
ViewModel 可以将命令实现为命令对象(实现ICommand接口的对象)。视图与命令的交互可以以声明方式定义,而无需在视图的代码隐藏文件中使用复杂的事件处理代码。例如,某些控件固有地支持命令并提供Command可以将数据绑定到ICommandViewModel 提供的对象的属性。在其他情况下,命令行为可用于将控件与 ViewModel 提供的命令方法或命令对象相关联。
实现ICommand接口很简单。Prism 提供了DelegateCommand此接口的实现,您可以在应用程序中轻松使用。
public class ArticleViewModel
public DelegateCommand SubmitCommand { get; private set; }
public ArticleViewModel()
SubmitCommand = new DelegateCommand(Submit);
async void Submit()
await SomeAsyncMethod();
依赖注入
使用 Prism 的依赖注入主要集中在为 Prism 使用而实施的各种容器上。
三种基本类型的依赖注册:瞬态、单例和作用域服务。重要的是要了解 Prism没有用,也没有Scoped Services 的实现。
注册瞬态服务
对于那些您希望在每次创建它时创建一个新实例的服务,您只需调用该
Register
方法并提供服务类型和实现类型,除非在可能适合简单注册具体类型的情况下。
containerRegistry.Register<FooService>();
containerRegistry.Register<IBarService, BarService>();
注册单例服务
containerRegistry.RegisterSingleton<FooService>();
containerRegistry.RegisterSingleton<IBarService, BarService>();
注册服务实例
containerRegistry.RegisterInstance<IFoo>(new FooImplementation());
Barrel.ApplicationId = "your_unique_name_here";
containerRegistry.RegisterInstance<IBarrel>(Barrel.Current);
检查服务是否已注册
很多时候,特别是在编写 Prism 模块或插件时,您可能想要检查服务是否已注册,然后根据它是否已注册来执行某些操作。
if (containerRegistry.IsRegistered<ISomeService>())
// Do something...
事件聚合器
Prism库提供了一种事件机制,可以在应用程序中松散耦合的组件之间进行通信。该机制基于事件聚合器服务,允许发布者和订阅者通过事件进行通信,并且彼此之间仍然没有直接引用。
提供EventAggregator多播发布/订阅功能。这意味着可以有多个发布者引发相同的事件,并且可以有多个订阅者监听相同的事件。考虑使用EventAggregator跨模块发布事件以及在业务逻辑代码(例如控制器和演示者)之间发送消息时。
事件聚合器
该类
EventAggregator
在容器中作为服务提供,并且可以通过
IEventAggregator
接口检索。事件聚合器负责定位或构建事件,并负责在系统中保存事件的集合。
public interface IEventAggregator
TEventType GetEvent<TEventType>() where TEventType : EventBase;
发布子事件
连接发布者和订阅者的真正工作是由
PubSubEvent
类完成的。
EventBase
这是包含在 Prism 库中的类的唯一实现。此类维护订阅者列表并处理向订阅者分发的事件。
该类
PubSubEvent
是一个泛型类,需要将有效负载类型定义为泛型类型。这有助于在编译时强制发布者和订阅者为成功的事件连接提供正确的方法。以下代码显示了 PubSubEvent 类的部分定义。
public class TickerSymbolSelectedEvent : PubSubEvent<string>{}
订阅事件
Subscribe
订阅者可以使用类上可用的方法重载之一来登记事件
PubSubEvent
。
public class MainPageViewModel
public MainPageViewModel(IEventAggregator ea)
ea.GetEvent<TickerSymbolSelectedEvent>().Subscribe(ShowNews);