1. 程式人生 > 其它 >Prism 學習之二 事件

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