[英]Questions regarding WPF commands
我對WPF命令有一些疑問。
我應該在哪里放置確認對話框? 我應該在命令回調函數中顯示它們嗎? 如果在應用程序的某些區域中我不希望命令顯示確認怎么辦?
如果我有一個顯示可以刪除的項目的用戶控件。 該命令應該在應用程序的視圖模型中,還是將其用於項目刪除,還是用戶控件本身也應具有一個依次調用視圖模型功能的命令? (注意:應用程序視圖模型是唯一具有執行此操作所需信息的模型)
如何在命令中傳遞數據? 我主要使用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之間進行雙向綁定。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.