添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
安静的弓箭  ·  2024 ...·  1 月前    · 
斯文的烤面包  ·  我是许佳琪你信不信·  1 年前    · 
爱吹牛的青蛙  ·  unicode-org/icu: The ...·  1 年前    · 
public bool CanExecute(object parameter) => _canExecute == null || _canExecute(); public void Execute(object parameter) => _execute(); public event EventHandler CanExecuteChanged add => CommandManager.RequerySuggested += value; remove => CommandManager.RequerySuggested -= value;

我們在Constructor將要執行的方法 _execute 與判斷是否可執行的方法 _canExecute 當作參數傳入並存至欄位。當Execute()或CanExecute()被呼叫時,便呼叫存好的 _execute _canExecute 。這就類似函數式編程(Functional Programming) 的概念,把方法作為變量使用。透過RelayCommand,我們就可以傳入任何想要執行的方法,把方法封裝成命令了。

注意到這裡我們為ICommand.CanExecuteChanged事件新增了adder與remover,目的是要讓新方法被註冊到事件上時,就自動把方法也註冊給CommandManager.RequerySuggested事件。這個事件是WPF系統處理使用者操作的事件,每當使用者按下按鍵、操作滑鼠時就會呼叫。因此,我們這樣設計CanExecuteChanged的目的就是要讓使用者每次有動作時,就觸發所有註冊到CanExecuteChanged的方法。畢竟,我們不知道使用者做了怎樣的操作會導致命令可行性改變,因此這樣可以確保永遠不會錯過可行性改變的狀況。然而,這樣設計的缺點就是會有效能浪費。所以這部分要怎麼設計,最終還是要看需求而定。

[WPF] MVVM – ViewModel 中的範例來說,我們可以使用RelayCommand,就可以把ChangeMessage命令改成:

// MainWindowViewModel.cs using System.Windows.Input; namespace WpfMVVM public class MainWindowViewModel : ViewModelBase public MainWindowViewModel() //ChangeMessage = new ChangeMessageCommand(this); ChangeMessage = new RelayCommand(() => Message = "!!!"); public string Name { get; set; } = "c.y.c"; public string Message { get; set; } = "hello world!"; public ICommand ChangeMessage { set; get; }

執行的效果與原先相同,而日後想要讓其他方法被綁定,同樣透過RelayCommand傳入方法即可。

透過本文,我們了解到RelayCommand的設計概念,可以簡化WPF中方法的綁定,以利減少開發程式的時間。然而,方法的綁定仍未完善,後續我們會介紹Expression blend interactivity,來幫助我們綁定任意的控制項事件。