当前位置: 首页 > news >正文

申请一个免费的网站空间成都网站建设网站

申请一个免费的网站空间,成都网站建设网站,宁波网站建设外包,百度地图怎么导航环线Prism Commands 1.命令#xff08;Commanding#xff09; 1.1. ViewModel的作用#xff1a; ViewModel不仅提供在视图中显示或编辑的数据#xff0c;还可能定义一个或多个用户可以执行的动作或操作。这些用户可以通过用户界面#xff08;UI#xff09;执行的动作或操作…Prism Commands 1.命令Commanding 1.1. ViewModel的作用 ViewModel不仅提供在视图中显示或编辑的数据还可能定义一个或多个用户可以执行的动作或操作。这些用户可以通过用户界面UI执行的动作或操作通常被定义为命令Commands。 1.2. 命令Commands的作用 命令提供了一种方便的方式来表示可以轻松绑定到UI控件的动作或操作。它们封装了实现动作或操作的实际代码并有助于将其与视图中的实际视觉表示分离。 1.3. 命令的触发方式 用户与视图交互时可以通过多种方式视觉上表示和调用命令。大多数情况下命令是由鼠标点击触发的但它们也可以由快捷键按下、触摸手势或其他输入事件触发。视图中的控件与ViewModel的命令数据绑定因此用户可以使用控件定义的任何输入事件或手势来调用它们。视图中的UI控件与命令之间的交互可以是双向的即命令可以在用户与UI交互时被调用UI也可以根据底层命令的启用或禁用状态自动启用或禁用。 1.4. 命令对象的实现 ViewModel可以将命令实现为命令对象一个实现了ICommand接口的对象。视图与命令的交互可以声明性地定义而不需要在视图的代码后台文件中编写复杂的事件处理代码。例如某些控件天生支持命令并提供了一个可以与ViewModel提供的ICommand对象数据绑定的Command属性。在其他情况下可以使用命令行为将控件与ViewModel提供的命令方法或命令对象关联起来。 1.5. ICommand接口的实现 实现ICommand接口是直接的。Prism框架提供了DelegateCommand这个ICommand接口的实现你可以在你的应用程序中直接使用它。 DelegateCommand可以在Prism.Core Nuget包的Prism.Commands命名空间中找到。 2.创建一个委托命令对象 如何在MVVM模式中使用DelegateCommand来实现命令以及如何将这些命令绑定到UI控件上。 2.1. DelegateCommand类封装了两个委托这两个委托分别对应于ViewModel中的Execute和CanExecute方法。这意味着当你在UI中触发一个命令时DelegateCommand会调用ViewModel中相应的方法。 2.2. 你可以通过DelegateCommand类的构造函数来指定这些委托。例如下面的代码示例展示了如何通过指定委托到ViewModel中的Submit和CanSubmit方法来构造一个代表提交命令的DelegateCommand实例。然后这个命令通过一个只读属性暴露给视图该属性返回对DelegateCommand的引用。 public class ArticleViewModel {public DelegateCommand SubmitCommand { get; private set; }public ArticleViewModel(){SubmitCommand new DelegateCommandobject(Submit, CanSubmit);}void Submit(object parameter){// 实现逻辑}bool CanSubmit(object parameter){return true;} }2.3. 当DelegateCommand对象的Execute方法被调用时它会通过你在构造函数中指定的委托将调用转发到ViewModel类中的方法。同样当CanExecute方法被调用时会调用ViewModel类中的对应方法。CanExecute方法的委托在构造函数中是可选的。如果没有指定DelegateCommand将始终返回true作为CanExecute的结果。 2.4. DelegateCommand类是一个泛型类型。类型参数指定了传递给Execute和CanExecute方法的命令参数的类型。在上面的例子中命令参数是object类型。Prism还提供了一个非泛型的DelegateCommand类用于不需要命令参数的情况定义如下 public class ArticleViewModel {public DelegateCommand SubmitCommand { get; private set; }public ArticleViewModel(){SubmitCommand new DelegateCommand(Submit, CanSubmit);}void Submit(){// 实现逻辑}bool CanSubmit(){return true;} }DelegateCommand避免使用值类型作为参数如果需要使用值类型参数时应该如何处理以避免潜在的问题 DelegateCommand避免使用值类型DelegateCommand这个类在设计时故意不使用值类型如int、double、bool等作为参数类型。这是因为ICommand接口接受的是一个对象类型的参数。值类型参数可能导致意外行为如果在XAML初始化时命令绑定调用了CanExecute(null)并且T是一个值类型那么可能会导致一些意料之外的行为。这是因为值类型在默认情况下会被初始化为它们的默认值如int的默认值是0这可能会导致命令的执行逻辑出现问题。默认值问题考虑过使用default(T)作为解决方案但最终被拒绝了。原因是实现者将无法区分一个有效的值和一个默认值。例如如果T是int那么default(int)是0但实现者可能无法确定0是一个有效的参数值还是一个默认值。使用可空类型如果你确实需要使用值类型作为参数那么必须将其转换为可空类型nullable。这可以通过使用DelegateCommandNullableint或者使用简写形式?语法DelegateCommandint?来实现。这样就可以区分一个有效的值和一个未赋值null的情况。 3.在视图中调用 ViewModel 提供的 DelegateCommands 3.1. 视图与命令对象的关联在视图中可以通过 Command 属性将控件与 ViewModel 提供的命令对象关联起来。这适用于 WPF、Xamarin.Forms 和 UWP 控件它们可以通过数据绑定轻松地与命令对象关联。 3.2. 数据绑定示例提供了一个按钮的示例代码展示了如何将按钮的 Command 属性绑定到 ViewModel 中的 SubmitCommand 命令上。代码如下 Button Command{Binding SubmitCommand} CommandParameterOrderId/这里{Binding SubmitCommand} 表示将按钮的 Command 属性绑定到 ViewModel 的 SubmitCommand 属性上CommandParameterOrderId 表示传递一个参数 “OrderId” 给命令的 Execute 方法。 3.3. 命令参数可以通过 CommandParameter 属性可选地定义一个命令参数。预期的参数类型在 DelegateCommand 的泛型声明中指定。当用户与控件交互时控件会自动调用目标命令如果提供了命令参数它将作为参数传递给命令的 Execute 方法。 3.4. 自动调用命令在上述示例中当按钮被点击时它会自动调用 ViewModel 中的 SubmitCommand。此外如果指定了 CanExecute 委托按钮会在 CanExecute 返回 false 时自动禁用在返回 true 时启用。 4.向UI发送变化通知 4.1. RaiseCanExecuteChanged方法 当你需要手动更新绑定到UI元素的状态时可以使用这个方法。例如当IsEnabled属性的值发生变化时在属性的setter中调用RaiseCanExecuteChanged来通知UI状态变化。 private bool _isEnabled; public bool IsEnabled {get { return _isEnabled; }set{SetProperty(ref _isEnabled, value);SubmitCommand.RaiseCanExecuteChanged();} }4.2. ObservesProperty方法 当命令需要在属性值变化时发送通知时可以使用这个方法。使用ObservesProperty方法时每当提供的属性值变化DelegateCommand会自动调用RaiseCanExecuteChanged来通知UI状态变化。 public class ArticleViewModel : BindableBase {private bool _isEnabled;public bool IsEnabled{get { return _isEnabled; }set { SetProperty(ref _isEnabled, value); }}public DelegateCommand SubmitCommand { get; private set; }public ArticleViewModel(){SubmitCommand new DelegateCommand(Submit, CanSubmit).ObservesProperty(() IsEnabled);}void Submit(){// 实现逻辑}bool CanSubmit(){return IsEnabled;} }注意使用ObservesProperty方法时可以链式注册多个属性进行观察。例如ObservesProperty(() IsEnabled).ObservesProperty(() CanSave)。 4.3. ObservesCanExecute方法 如果你的CanExecute是简单布尔属性的结果你可以消除声明CanExecute委托的需要改用ObservesCanExecute方法。ObservesCanExecute不仅会在注册的属性值变化时向UI发送通知还会使用同一个属性作为实际的CanExecute委托。 public class ArticleViewModel : BindableBase {private bool _isEnabled;public bool IsEnabled{get { return _isEnabled; }set { SetProperty(ref _isEnabled, value); }}public DelegateCommand SubmitCommand { get; private set; }public ArticleViewModel(){SubmitCommand new DelegateCommand(Submit).ObservesCanExecute(() IsEnabled);}void Submit(){// implement logic} }警告不要尝试链式注册ObservesCanExecute方法。只能为CanExecute委托观察一个属性。 5.在命令中使用异步方法 在现代编程中使用async和await调用异步方法是很常见的需求。虽然许多人的第一反应是需要一个AsyncCommand但实际上这种假设是错误的。ICommand本质上是同步的Execute和CanExecute委托应该被视为事件。这意味着使用async void作为命令的语法是完全有效的。文中提供了两种使用DelegateCommand与异步方法的方法。 选项 1 public class ArticleViewModel {public DelegateCommand SubmitCommand { get; private set; }public ArticleViewModel(){SubmitCommand new DelegateCommand(Submit);}async void Submit(){await SomeAsyncMethod();} }在这个选项中Submit方法被声明为async void这意味着它可以包含await语句来调用异步方法。DelegateCommand在执行时会调用这个Submit方法。 选项 2 public class ArticleViewModel {public DelegateCommand SubmitCommand { get; private set; }public ArticleViewModel(){SubmitCommand new DelegateCommand(async () await Submit());}Task Submit(){return SomeAsyncMethod();} }在这个选项中Submit方法被声明为返回Task的普通方法而DelegateCommand的构造函数中使用了lambda表达式async () await Submit()来包装这个方法调用。这样当DelegateCommand被执行时它会调用这个lambda表达式该表达式会异步地调用Submit方法。 这两种方法都允许你在DelegateCommand中使用异步方法同时保持ICommand的同步特性。选择哪种方法取决于你的具体需求和偏好。 相关链接 介绍Introduction命令Commands 命令Commanding 复合命令Composite Commands
http://www.hkea.cn/news/14377597/

相关文章:

  • 国内网站要备案开发一个视频网站要多少钱
  • 广东网站开发哪家强深圳企业官网网站建设
  • asp.net 网站访问量网站服务器架设
  • 寻找做网站的合作伙伴北京企业建设网站 入账
  • 京东联盟怎么做CMS网站浏览器登录入口
  • 制作一个网页需要哪几个步骤网站优化 推广
  • 手机网站建设经典教程企业网是什么
  • 做房产中介需要有内部网站吗在服务器上运行wordpress
  • 织梦房产网站源码展览馆展示设计
  • 青岛君哲网站建设公司网站建设费用明细表
  • 电子商务网站建设名词解释郑州建设局官方网站
  • 哪里找网站开发团队怎么自己学着做网站
  • 合肥营销型网站建设开发偃师网站
  • 企业建站wordpresswordpress 调查问卷
  • 如何使用凡科建设网站网站建设投
  • 网站移动页面怎么做的做网站赚钱吗
  • 网站建设有模板吗asp.net 微网站开发
  • 新沂网站设计网络游戏电脑
  • 北京黄村专业网站建设价钱linux主网站设计
  • 网站建设三网合一优秀设计集锦网站
  • 网站seo 最好ps做产品的网站
  • python 网站开发框架网站开发合同怎么写
  • 网站建设规划设计公司vs做网站的书籍
  • 自己有网站 做app吗用vs2012做asp网站
  • 福州移动网站建设wordpress相同字段调用
  • 富顺做网站做网站的上海市哪家技术好
  • 做saas平台网站网址注册平台
  • 三 网站开发使用软件环境wordpress热词标签
  • h5企业网站只做南召微网站建设
  • 网站开发完以后交付源代码学电商