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 状态更改。ObservesPropertyObservesPropertyDelegateCommandRaiseCanExecuteChanged

    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;
        }

六、实现基于任务的命令

在当今的世界中,在代表内部调用异步方法是很常见的要求。每个人的第一本能是他们需要一个,但这个假设是错误的。 本质上是同步的,应该考虑和代表的事件。这意味着这是一个完全有效的语法用于命令。有两种方法使用同位制方法。asyncawaitExecuteAsyncCommandICommandExecuteCanExecuteasync voidDelegateCommand

选项 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();
    }
}
原文地址:https://www.cnblogs.com/minhost/p/15153567.html