2014-06-08 54 views
3

我正在尋找處理wpf mvvm項目中越來越多的命令的建議。在WPF MVVM中處理大量命令

我的ViewModels正在收集好一些他們,我覺得之前的項目成熟,我需要做的更好的東西來處理它們。現在我所有的命令都被列爲視圖模型中的屬性,並且可以加載到虛擬機的構造函數中,也可以延遲加載。

而且如果它的事項我使用MVVM聖光的ICommand RelayCommand實施。

我已經看到了一個更大的開源項目,他們將在收集和分組這些集合到多個集合......這一切似乎都非常的混亂給我,但背景是有點不同,因爲所有這些命令都綁定到菜單。我在這個應用程序中沒有典型的下拉菜單,但我確實使用了許多不同的上下文菜單/按鈕。

不管怎麼說,什麼都在處理命令,無論從代碼的可讀性/可維護性以及功能的角度看的一些想法?

+3

當我有很多命令時,我已經將它們放置在名爲XXXXCommanding的虛擬機的部分類中,其中XXXX是VM的名稱。然而,我不會把它們放在收藏中。如果我需要迭代所有命令,我將使用反射。 –

+4

你是否認爲你的ViewModels可能會做很多工作? – CodeMonkey

+1

我在@CodeMonkey上。濫用部分類來跨越多個單獨文件分裂你的巨人類只是隱藏了問題。 –

回答

1

This post告訴你如何爲暴露你的自定義命令創建動態性能。您可以將其與反射混合以處理大量命令。

創建一個自定義屬性:

[AttributeUsage(AttributeTargets.Class)] 
public class CommandClassAttribute : Attribute 
{ 
    readonly string commandName; 

    public CommandClassAttribute(string commandName) 
    { 
     this.commandName = commandName; 
    } 

    public string CommandName 
    { 
     get { return commandName; } 
    } 
} 

然後標記它所有的命令:

[CommandClass("New")] 
public class NewCommand : ICommand 
{ 
    public bool CanExecute(object parameter) 
    { 
     return true; 
    } 

    public void Execute(object parameter) 
    { 
     MessageBox.Show("New"); 
    } 

    public event EventHandler CanExecuteChanged; 
} 

然後,您可以加載所有的命令在應用程序啓動:

readonly Dictionary<string, ICommand> commands = new Dictionary<string, ICommand>(); 

void LoadCommands() 
{ 
    Type[] types = Assembly.GetExecutingAssembly().GetExportedTypes(); 
    var iCommandInterface = typeof(ICommand); 
    foreach (Type type in types) 
    { 
     object[] attributes = type.GetCustomAttributes(typeof(CommandClassAttribute), false); 
     if (attributes.Length == 0) continue; 
     if (iCommandInterface.IsAssignableFrom(type)) 
     { 
      string commandName = ((CommandClassAttribute)attributes[0]).CommandName; 
      commands.Add(commandName, (ICommand)Activator.CreateInstance(type)); 
     } 
    } 
} 

這種架構可以輕鬆擴展以支持插件中的定義命令。

0

現在我所有的命令都被列爲我的viewmodels中的屬性,並且可以加載到VM的構造函數中,也可以延遲加載。

而是在ViewModel使每個命令的獨特屬性,嘗試進行單一的集合屬性Commands持有該ViewModel所有命令。

這樣,你只需要創建並且所有的命令添加到Commands集合中的ViewModel構造或者甚至從ViewModel構造函數外的工廠方法。

無論如何,從代碼可讀性/可維護性以及功能角度來看,處理命令有哪些想法?箱子

  1. 95%沒有必要在ViewModel命令之間進行區分。

  2. 它更容易保持一個集合屬性,要保持大量的ViewModel屬性。

  3. Commands集合可以很容易地進行合成並映射到工具欄或分層上下文菜單。

  4. 在不更改現有類或子類的情況下向ViewModel添加命令的功能非常棒。

1

呃......如果它困擾着你看他們,然後把他們放在一個#地區和崩潰的地區。那個建議把它們放在字典中的人,所以你只有一個屬性,這對我來說似乎是一個維護頭痛......而且XAML綁定變得混亂。