Prism 学习之二 事件
一、事件
Prism提供了对要显示或编辑的视图中的数据进行处理以外,ViewModel 还可能定义用户可以执行的一个或多个操作。用户可以通过 UI 执行的操作通常被定义为Command。Command提供了一种方便的方式来表示操作,这些操作很容易与 UI 中的控件绑定。它们封装了实施操作或操作的实际代码,并帮助使其与视图中的实际视觉表示脱离。
命令可以用于用户与视图进行交互,在大多数情况下,它们会因鼠标单击而调用,但也可以由于快捷键按压、触摸手势或任何其他输入事件而调用它们。视图中的控件是与 ViewModels 绑定的数据,因此用户可以使用控制定义的任何输入事件或手势调用它们。视图中的 UI 控件与命令之间的交互可能是双向的。在这种情况下,当用户与 UI 交互时,可以调用命令,当基础命令启用或禁用时,可以自动启用或禁用 UI。
视图模型可以将命令作为Command Object(实现界面的对象)执行命令。可以声明性地定义视图与命令的交互,而无需在视图的代码后文件中使用复杂的事件处理代码。
二、创建DelegateCommand
Prism类封装了两个代理函数,每个代理函数都引用在视图模型类中实现的方法。它通过调用这些代表来实现界面和方法。您指定了类构造器中查看模型方法的代表。例如
private DelegateCommand _commandLoad = null; public DelegateCommand CommandLoad => _commandLoad ?? (_commandLoad = new DelegateCommand(CommandLoadExecute)); private void CommandLoadExecute() { }
三、从视图中调用DelegateCommand
有许多方法可以将视图中的控件与 ViewModel 提供的命令对象关联。某些 WPF、Xamarin.Forms 和 UWP 控件可以轻松地通过属性将数据绑定到命令对象。
<Button Grid.Row="1" Width="80" Height="40" Command="{Binding CommandLoad}" Content="LOAD" />
四 重置是否能操作
每当您需要手动更新绑定 UI 元素的状态时,请使用该方法。例如,当属性值发生变化时,我们调用属性设置器通知 UI 状态更改。RaiseCanExecuteChanged
private bool _isEnabled=false; public bool IsEnabled { get { return _isEnabled; } set { SetProperty(ref _isEnabled, value); _commandLoad.RaiseCanExecuteChanged(); } } private DelegateCommand _commandLoad = null; public DelegateCommand CommandLoad => _commandLoad ?? (_commandLoad = new DelegateCommand(CommandLoadExecute, CanSubmit)); bool CanSubmit() { return IsEnabled; }
五、观察执行
如果命令在属性值更改时发送通知,则可以使用该方法。使用该方法时,每当所提供属性的价值发生变化时,会自动调用通知 UI 状态更改。ObservesProperty
ObservesProperty
DelegateCommand
RaiseCanExecuteChanged
public bool IsEnabled { get { return _isEnabled; } set { SetProperty(ref _isEnabled, value); } } private DelegateCommand _commandLoad = null; public DelegateCommand CommandLoad => _commandLoad ?? (_commandLoad = new DelegateCommand(CommandLoadExecute, CanSubmit).ObservesProperty(()=>IsEnabled)); bool CanSubmit() { return IsEnabled; }
六、实现基于任务的命令
在当今的世界中,在代表内部调用异步方法是很常见的要求。每个人的第一本能是他们需要一个,但这个假设是错误的。 本质上是同步的,应该考虑和代表的事件。这意味着这是一个完全有效的语法用于命令。有两种方法使用同位制方法。async
await
Execute
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(); } }
选项 2:
public class ArticleViewModel { public DelegateCommand SubmitCommand { get; private set; } public ArticleViewModel() { SubmitCommand = new DelegateCommand(async ()=> await Submit()); } Task Submit() { return SomeAsyncMethod(); } }