2011-03-19 202 views
4

我正在開發一個WPF應用程序,該應用程序具有可用於多個自定義命令的工具欄/菜單。可能在15-20左右。我見過有關如何創建自定義命令的文檔,但它們都不一定適用於我所要做的。wpf中的自定義命令

我正在使用一個控制器來處理我的應用程序中的業務邏輯,並且我試圖讓我的視圖根本不做任何邏輯。

我想要做的是在我的項目中創建一個包含自定義命令類的目錄,以便將它們從控制器和視圖中分離出來,但我仍然希望從視圖中調用它們,例如一個正常的命令是。

我也看到使用DelegateCommand類的,但我不太清楚,如果這是我想領導的方向。

我希望能夠有任意自定義命令類如以下

public CustomCommand: ICommandd 
{ 
    public bool CanExecute(object parameter) 
    { 
     //arbitrary logic 
    } 

    public void Execute(object parameter) 
    { 

    } 
} 

的想法是,我將有10〜20這些,我想,讓他們從一切分開,並在需要的時候它們被調用。

我知道有一種方法可以分離我的自定義命令,但我不太確定。

我是新來的使用命令,所以我仍然試圖抓住這個概念。

感謝,

回答

1

使用RelayCommand,它不要求你創建一個類爲每個命令,你只需兩種方法添加到構造爲lambda表達式/代表。

我在我的項目中使用它,這是一個真正的節省時間。

4

這個概念是你將一個命令綁定到一個按鈕上,該命令驅動這個按鈕的兩個屬性:「點擊」和「啓用」,導致你發佈的界面。

您想要執行命令的主要原因是能夠將按鈕點擊綁定到視圖模型中的操作。

如果您創建一個將操作作爲構造函數參數的自定義命令,則可以將視圖模型中的方法直接連接到您的命令。在您的視圖模型

public class RelayCommand: ICommandd 
{ 
    Action action; 
    Func<bool> canExecute; 

    public RelayCommand(Action action) : this(action,() => true) {} 
    public RelayCommand(Action action, Func<bool> canExecute) 
    { 
     this.action = action; 
     this.canExecute = canExecute; 
    } 

    public bool CanExecute(object parameter) 
    { 
     return canExecute(); 
    } 

    public void Execute(object parameter) 
    { 
     action(); 
    } 
} 

用法是

public RelayCommand SaveCommand { get; set; } 

SaveCommand = new RelayCommand(OnSave); 

public void Save() 
{ 
    // save logic... 
} 

如果你想連線CanExecute,也可以使用第二個構造函數,並提供CanSave方法。

public RelayCommand SaveCommand { get; set; } 

SaveCommand = new RelayCommand(OnSave, CanSave); 

public void Save() 
{ 
    // save logic... 
} 

public bool CanSave() 
{ 
    return // ... 
} 

正如你可能注意到我在我的實現中刪除了命令參數。這在大多數情況下是足夠的,並且可以在你的處理器方法中保存額外的參數。對於10%左右我實現了一個RelayCommand<T>這需要一個行動,而不是行動和改變Execute方法

public void Execute(object parameter) 
    { 
     action((T)parameter); 
    } 

這需要一個參數化處理

SaveCommand = new RelayCommand<SomeType>(OnSave); 

public void Save(SomeType toSave) 
{ 
    // save logic using parameter 
} 

這樣可以節省你遇到的時候所有鑄造的問題使用object變量並保持您的視圖模型類型安全。

+0

這的確是這樣做的命令非常有用的方式,尤其是對MV-VM架構,但不幸的是,這不是我很是什麼尋找,如果你閱讀上面,我實際上是想分開我的觀點的所有邏輯,我有這樣做的具體原因,我實際上找到了我在這裏找的是什麼http://www.codeproject.com/KB /WPF/CentralizingWPFCommands.aspx?display=Print - Upvote爲你的好例子,謝謝! – TheJediCowboy 2011-03-20 20:44:32

+0

即使您想通過靜態類提供您的命令,我也會推薦使用RelayCommands。這樣你就不需要代碼爲你的xaml文件和'_DeleteContact = new RoutedUICommand(「Delete a existing contact」,「DeleteContact」,typeof(MyAppCommands));'包含可能改變和阻礙重構的硬編碼字符串。我會對你的用例感興趣。爲什麼你想把所有的命令放到一個靜態類中? – Zebi 2011-03-20 21:38:17