簡體   English   中英

何時將事件和命令用於WPF / MVVM?

[英]When to use event and command for WPF/MVVM?

我正在練習如何使用MVVM模式編寫WPF應用程序。 到目前為止,我還沒有在代碼中使用命令。 在我的Viewmodel中,我實現INotifyPropertyChanged並用於觸發(事件PropertyChangedEventHandler PropertyChanged )事件。 為什么我仍然想念WPF有關如何使用命令的某些概念?

什么時候適合使用命令?

WPF中的命令用於抽象用戶觸發的操作(例如單擊“ Button或按某個鍵)。

這是一個基本示例:

假設您要在用戶單擊“搜索”按鈕或在聚焦搜索框時按Enter鍵時在數據庫中搜索員工。

您可以這樣定義ViewModel:

public class MyViewModel: ViewModelBase
{
    public string SearchText {get;set;} //NotifyPropertyChanged, etc.

    public Command SearchCommand {get;set;}

    public MyViewModel()
    {
        //Instantiate command
        SearchCommand = new DelegateCommand(OnSearch);
    }

    private void OnSearch()
    {
        //... Execute search based on SearchText
    }
}

和您的觀點:

<StackPanel>
    <TextBox Text="{Binding SearchText, UpdateSourceTrigger=PropertyChanged}">
        <TextBox.InputBindings>
            <KeyBinding Key="Enter" Command="{Binding SearchCommand}"/>
        </TextBox.InputBindings>
    </TextBox>
    <Button Content="Search" Command="{Binding SearchCommand}"/>
</StackPanel>

注意,如何將KeyBinding和Button的Command屬性都綁定到ViewModel中的同一Command( SearchCommand )。 這有利於重用,還有助於將ViewModel的實際邏輯及其所有優點(可測試性等)保留在ViewModel中,同時保持視圖整潔且無需編寫代碼。

有趣的是,絕對不需要使用WPF中的原始Commands概念:)。 您可以使用大型MVVM和免費的開源應用程序框架庫Caliburn.Micro來充分利用松耦合設計(xaml)和業務邏輯(c#/ vb代碼)的美感來構建大型復雜的應用程序。

免責聲明 :我只是這個庫的快樂用戶,並且與它的創建者沒有任何關系,因此這不是付費廣告或類似的東西。

請看一下官方文檔中的這個非常基本的示例

-> 基本配置,操作和約定 <-

這樣,您就可以將XAML視圖中的事件直接綁定到C#視圖模型中的方法中,而不會給命令聲明和注冊帶來麻煩(例如在其他類似的應用程序框架中實現)代理代碼。

沒關系,此示例是Silverligh應用程序-Caliburn.Micro幾乎以相同的方式支持所有主要的Xaml平台 ,並且WPF示例與基於Silverlight的外觀非常相似。

除了提到的主要功能(基於方法)之外,Caliburn.Micro還具有:

  • 方便的預定義綁定命名約定,使您的XAML文件清晰易讀(並且仍然對設計時友好!)
  • INotifyPropertyChanged的基本實現,以便您可以從中繼承所有視圖模型
  • 基本類,用於實現常見方案,例如:
    • 主細節
    • 親子
    • 選定項目清單
  • EventAggregator用於視圖模型與其他類之間的更為松散的耦合通信
  • 松散耦合的支持,例如鍵盤焦點和Windows管理(用於WPF)
  • 還有更多:)

只要給它機會,您就不再需要香草WPF命令;)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM