簡體   English   中英

有關WPF命令的問題

[英]Questions regarding WPF commands

我對WPF命令有一些疑問。

  1. 我應該在哪里放置確認對話框? 我應該在命令回調函數中顯示它們嗎? 如果在應用程序的某些區域中我不希望命令顯示確認怎么辦?

  2. 如果我有一個顯示可以刪除的項目的用戶控件。 該命令應該在應用程序的視圖模型中,還是將其用於項目刪除,還是用戶控件本身也應具有一個依次調用視圖模型功能的命令? (注意:應用程序視圖模型是唯一具有執行此操作所需信息的模型)

  3. 如何在命令中傳遞數據? 我主要使用DelegateCommand ,並在為網格項觸發命令時,我想傳遞選定的項,否則應用程序的主視圖模型將必須找到網格並找出其選擇,這會將命令硬編碼到網格並使其不可重用。

這有點意見和風格。 這是我的方法:

問題1:

我有一個處理任何確認的實用程序類,並且在MVVM Light中使用輕量級消息傳遞來處理視圖,確認和viewmodel之間的通信。

編輯:關於點1的更多信息

在我的Command中,我將沿着“ ConfirmDeletionMessage”行發送一條消息,然后由我的對話框實用程序類接收該消息。 對話框實用程序類向用戶顯示適當的消息,並檢查結果。 根據結果​​,它將廣播“ DeletionConfirmedMessage”或“ DeletionCanceledMessage”,然后由ViewModel處理,以完成或取消刪除。

如果您有多個訂閱者,則存在一定的風險,因為您不知道將按照什么順序處理消息,但是如果您對消息使用者有嚴格的管理,或者確保他們可以在消息使用者中運行隨機順序,這種方法效果很好,並且以可測試的方式將您的View和Model代碼分開。

問題2:

這是一個艱難的過程,它將取決於您的整體應用程序。 我個人是將其放入項目的視圖模型的愛好者。 這樣,您不必擔心第三個問題。 相反,刪除操作僅適用於您要處理的項目。 但是 ,如果您必須對列表項之外的數據進行操作(例如將其從列表中刪除),則將命令放在父viewmodel上更為有意義。

問題3:

使用CommandParameter屬性。 您可以將此綁定到您想要的任何對象。

編輯答案#2

馬克·格林(馬​​克·格林(以下評論))讓我思考。 我最初在WP7中采用了這種方法,它絕對適合我需要做的事情。 但是,還有其他處理方法應該絕對考慮。 另一個選項是您的視圖模型可以使用的“確認類”。 如果您使用的是IoC內核,那么通過構造函數/屬性注入就可以輕松實現。 或者,如果您還有其他獲取類的方法,請這樣做,但要以可以在測試中模擬的方式進行。 它可能看起來像這樣:

public class ExampleViewmodel : ViewModel
{
      private IConfirmDialogManager _dialogManager;
      public ExampleViewmodel(IConfirmDialogManager dialog)
      {
            _dialogManager = dialog;
      }

      // ... code happens ...
      private void DeleteCommand()
      {
             bool result = _dialogManager.Confirm("Are you sure you want to delete?");
      }
}

使用IConfirmDialogManager接口,如下所示:

public interface IConfirmDialogManager
{
      bool Confirm(string message);
}

然后您將適當實施。

我應該在哪里放置確認對話框? 我應該在命令回調函數中顯示它們嗎? 如果在應用程序的某些區域中我不希望命令顯示確認怎么辦?

確認對話框和顯示消息對話框是視圖。 您的VM應該有一種通知您的視圖的方式,即它想要顯示或詢問某些內容,然后該視圖應決定如何顯示它(狀態欄,窗口,彈出窗口,語音消息等)。

如果我有一個顯示可以刪除的項目的用戶控件。 該命令應該在應用程序的視圖模型中,還是將其用於項目刪除,還是用戶控件本身也應具有一個依次調用視圖模型功能的命令? (注意:應用程序視圖模型是唯一具有執行此操作所需信息的模型)

項目控件應引發一個刪除命令。 VM應該處理命令並決定要執行的操作(VM應該具有所選項目的列表,並且視圖應綁定到該列表)。

如何在命令中傳遞數據? 我主要使用DelegateCommand,並且在為網格項目觸發命令后,我想傳遞選定的項目,否則應用程序的主視圖模型將必須找到網格並找出其選擇,這會將命令硬編碼到網格並使其不可重用。

命令可以具有參數(例如RoutedUICommand)。 命令綁定可以為參數指定綁定表達式。 但是,正確的方法是讓VM成為選擇的源,並在視圖的選擇和VM之間進行雙向綁定。

  1. 只需在您的視圖模型中使用一個dialogservice
  2. 它取決於但仍然可以通過RelativeSource綁定輕松到達命令所在的對象/視圖模型
  3. CommandParameter是一種方法。 實際上,您使用mvvm應該將所需的所有信息綁定到您的viewmodel。 因此,如果您有命令,並且需要列表視圖中的selecteditem,則可以將其綁定到視圖模型,而無需將其設置為commandparameter

暫無
暫無

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

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