• 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();
        }
    }
  • 相关阅读:
    根据某字符(字符串)分割字符串
    call函数心得
    Git之常用命令
    ES6之async与await
    CSS之 sass、less、stylus 预处理器的使用方式
    JavaScript之继承
    vue之keep-alive的使用
    CSS之单行、多行文本溢出显示省略号
    Vue之 watch、computed、filter之间的区别与使用场景
    Vue之watch监听对象中某个属性的方法
  • 原文地址:https://www.cnblogs.com/minhost/p/15153567.html
Copyright © 2020-2023  润新知