Prism基础教程

更新时间:2023-07-22 21:00:29 阅读: 评论:0

Prism 一 介绍
Prism是一个在WPF、UWP、Xamarin Forms中构建松散耦合,可维护和可测试的XAML应用程序的框架。
每个平台都有单独版本,这些版本在独立的时间表上开发。
Prism提供一组设计模式的实现,这些设计模式有助于编写结构良好且可维护的XAML应用程序,包括MVVM,依赖注入,命令,EventAggregator等。
Prism的核心功能是针对这些平台的共享代码库。
那些需要特定于平台的东西在目标平台相应库中实现。
Prism还提供了这些模式与目标平台的完美集成。ian
例如,Prism for UWP和Xamarin Forms允许使用抽象来进行可单元测试的导航,和在平台概念和API之上进行导航,以便可以充分利用平台本身提供的功能。
Prism 6是完全开源版本。核心团队成员都是开发Prism 1到5的团队的一部分,现在已经将转交给开源社区,保持它活跃和发展,以支持社区。
有成千上万的公司为WPF,Silverlight和Windows Runtime采用了之前版本的Prism,我们希望他们将继续与我们一起继续发展和改进框架,以跟上当前平台功能和要求。
目前,还没有计划为Silverlight或Windows 8 / 8.1 / WP8.1创建新版本的库。对于那些你仍然可以使用早期版本。如果有足够兴趣和贡献者来完成这项工作,可以考虑一下,但目前不在开发的路线图上。
Prism 二 命令
除了在视图中对数据进行显示或编辑外,ViewModel还可能定义由用户执行的一个或多个动作。
用户可以通过UI执行的动作通常被定义为命令。命令提供一种方便的方法绑定到UI中的控件的动作。它封装了实现动作的实际代码,并使其与视图中的实际可视化表示分离。
当用户与视图交互时,用户可以以多种不同的方式直观地表示和调用命令。在大多数情况下,它们是通过鼠标单击调用的,但也可以通过快捷键按下,触摸手势或任何其他输入事件来调用。视图中的控件绑定到ViewModel命令,以便用户可以使用控件定义的任何输入事件或手势来调用。视图中的UI控件与命令之间的交互可以是双向的。所以,可以在用户与UI交互时调用该命令,并且可以在启用或禁用命令时自动启用或禁用UI。
ViewModel可以将命令实现为命令对象(实现ICommand接口的对象)。可以以声明方式定义视图与
命令的交互,无需在视图的代码隐藏文件中使用复杂的事件处理代码。例如,某些控件本身支持命令并提供Command 属性,该属性可以是绑定到ViewModel提供的ICommand对象的数据。在其他情况下,命令行为可用于将控件与ViewModel提供的命令方法或命令对象相关联。
实现ICommand接口非常简单。Prism提供了此接口的DelegateCommand实现,您可以在应用程序中使用它。注意
DelegateCommand在Prism.Commands命名空间中,该命名空间位于Prism.Core NuGet包中。
delirium
创建 DelegateCommand
Prism DelegateCommand类封装了两个委托,每个委托引用ViewModel类中实现的方法。它通过调用这些委托来实现ICommand接口的Execute和CanExecute方法。在DelegateCommand类构造函数中指定ViewModel 方法的委托。例如,以下代码示例显示如何通过指定OnSubmit和CanSubmit ViewModel方法的委托来构造表示Submit命令的DelegateCommand实例。然后,该命令通过只读属性公开给视图,该属性返回对DelegateCommand的引用。
public class ArticleViewModel
娇艳欲滴的玫瑰{
public DelegateCommand SubmitCommand { get; private t; }
public ArticleViewModel()
{
SubmitCommand = new DelegateCommand<object>(Submit, CanSubmit);
}
void Submit(object parameter)
{busy什么意思
//implement logic
会计发展方向怎么写}
2020年12月四级啥时间出成绩bool CanSubmit(object parameter)
{
return true;
}
}
当在DelegateCommand对象上调用Execute方法时,它只是通过您在构造函数中指定的委托将调用转发到ViewModel类中的方法。类似地,当调用CanExecute方法时,将调用ViewModel类中的相应方法。构造函数中CanExecute方法的委托是可选的。如果未指定委托,则DelegateCommand将始终为CanExecute返回true。
DelegateCommand类是泛型类型。type参数指定传递给Execute和CanExecute方法的命令参数的类型。在前面的示例中,command参数的类型为object。Prism还提供了非泛型版本的DelegateCommand类,以便在不需要命令参数时使用,并定义如下:
public class ArticleViewModel
亚洲瑜伽培训学院
{
public DelegateCommand SubmitCommand { get; private t; }
public ArticleViewModel()
{
SubmitCommand = new DelegateCommand(Submit, CanSubmit);
thumbs是什么意思
}
void Submit()
{
//implement logic
}
bool CanSubmit()
{
return true;
}
}
注意
DelegateCommand故意阻止使用值类型(int,double,bool等)。因为ICommand接受一个对象,所以在XAML初始化期间为命令绑定调用CanExecute(null)时,具有 T 的值类型会导致意外。不使用default(T)作为解决方案,因为实现者无法区分有效值和默认值。如果您希望使用值类型作为参数,则必须使用DelegateCommand <Nullable <int >>或简写使其可为空?语法(DelegateCommand <int?>)。
在视图中调用DelegateCommands
有许多方法可以将视图中的控件与ViewModel提供的命令对象相关联。某些WPF,Xamarin.Forms和UWP控件可以通过Command属性绑定到命令对象。
<Button Command="{Binding SubmitCommand}" CommandParameter="OrderId"/>
也可以使用CommandParameter属性定义命令参数。期望参数的类型在DelegateCommand <T>泛型
声明中指定。当用户与该控件交互时,控件将自动调用目标命令,并且命令参数(如果提供)将作为参数传递给命令的Execute方法。在前面的示例中,按钮将在单击时自动调用SubmitCommand。此外,如果指定了CanExecutedelegate,则在CanExecute返回fal时将自动禁用该按钮,如果返回true,则将启用该按钮。
变更通知
ViewModel通常需要指示命令的CanExecute状态的更改,以便UI中绑定到该命令的任何控件将更新其启用状态以反映绑定命令的可用性。DelegateCommand提供了几种将这些通知发送到UI的方法。
RaiCanExecuteChanged
每当需要手动更新绑定的UI元素的状态时,请使用RaiCanExecuteChanged方法。例如,当IsEnabled属性值更改时,我们在属性的tter中调用RaiCanExecuteChanged以通知UI状态更改。
private bool _isEnabled;
public bool IsEnabled
{
get { return _isEnabled; }
t
{
SetProperty(ref _isEnabled, value);
SubmitCommand.RaiCanExecuteChanged();
}
}
ObrvesProperty
如果命令应在属性值更改时发送通知,则可以使用ObrvesProperty方法。使用ObrvesProperty方法时,只要提供的属性的值发生更改,DelegateCommand将自动调用RaiCanExecuteChanged以通知UI状态更改。
public class ArticleViewModel : BindableBa
{
private bool _isEnabled;
public bool IsEnabled
{
get { return _isEnabled; }
t { SetProperty(ref _isEnabled, value); }
}
public DelegateCommand SubmitCommand { get; private t; }
public ArticleViewModel()
quart{
SubmitCommand = new DelegateCommand(Submit, CanSubmit).ObrvesProperty(() => IsEnabled);
}
void Submit()
{
//implement logic
}
bool CanSubmit()
{
return IsEnabled;
}
}
注意
使用ObrvesProperty方法时,可以链式注册多个属性以供观察。示例:ObrvesProperty(()=>
IsEnabled).ObrveProperty(()=> CanSave)。
ObrvesCanExecute
如果CanExecute是简单布尔属性的结果,则可以省去声明CanExecute委托,而是使用ObrvesCanExecute 方法。ObrvesCanExecute不仅会在注册属性值更改时向UI发送通知,而且还会使用与实际CanExecute委托相同的属性。锅贴儿
public class ArticleViewModel : BindableBa
{
private bool _isEnabled;
public bool IsEnabled
{
get { return _isEnabled; }
t { SetProperty(ref _isEnabled, value); }
}
public DelegateCommand SubmitCommand { get; private t; }
public ArticleViewModel()
{
SubmitCommand = new DelegateCommand(Submit, CanSubmit).ObrvesCanExecute(() => IsEnabled);
}
void Submit()
{
//implement logic
}
}
警告
不要以链接注册ObrvesCanExecute方法,因为CanExcute委托只能观察到一个属性。
实现基于Task的DelegateCommand
在async / await模式中,在Executedelegate中调用异步方法是一个非常常见的要求。每个人的第一直觉是他们需要AsyncCommand,但这种假设是错误的。ICommand本质上是同步的,Execute和CanExecute委托应该被视为事件。这意味着async void是用于命令的完全有效的语法。使用DelegateCommand的异步方法有两种方法。
第一种:
public class ArticleViewModel
{
public DelegateCommand SubmitCommand { get; private t; }
public ArticleViewModel()
{

本文发布于:2023-07-22 21:00:29,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/78/1111508.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:命令   使用   方法   调用
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图