首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在WPF MVVM中处理大量命令

在WPF MVVM中处理大量命令
EN

Stack Overflow用户
提问于 2014-06-09 05:12:17
回答 3查看 1.5K关注 0票数 4

我正在寻找在wpf mvvm项目中处理越来越多的命令的建议。

我的视图模型收集了大量的视图模型,我觉得在项目成熟之前,我需要做一些更好的事情来处理它们。现在,我的所有命令都只是在视图模型中作为属性列出,或者加载到VM的构造函数中,或者延迟加载。

如果重要的话,我使用的是MVVM Light的ICommand的RelayCommand实现。

我见过一个更大的开源项目将它们放在集合中,并将这些集合分组到更多的collections...that中,这对我来说似乎真的很混乱,但上下文有点不同,因为所有这些命令都绑定到菜单上。我在这个应用程序中没有典型的下拉菜单,但我确实使用了许多不同的上下文菜单/按钮。

不管怎样,从代码的可读性/可维护性以及功能的角度来看,关于处理命令有什么想法?

EN

回答 3

Stack Overflow用户

发布于 2015-03-04 00:57:31

This post向您展示了如何创建动态属性来公开您的自定义命令。您可以将其与反射混合使用,以便处理大量命令。

创建自定义属性:

代码语言:javascript
运行
复制
[AttributeUsage(AttributeTargets.Class)]
public class CommandClassAttribute : Attribute
{
    readonly string commandName;

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

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

然后用它标记所有命令:

代码语言:javascript
运行
复制
[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;
}

然后,您可以在应用程序启动时加载所有命令:

代码语言:javascript
运行
复制
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));
        }
    }
}

这种架构可以很容易地扩展到支持在插件中定义命令。

票数 1
EN

Stack Overflow用户

发布于 2015-08-02 10:29:44

嗯..。如果你不喜欢看它们,那就把它们放在一个#区域中,然后折叠该区域。这个人建议把它们放在字典里,这样你只有一个属性对我来说似乎是一个令人头疼的维护问题……XAML绑定变得杂乱无章。

票数 1
EN

Stack Overflow用户

发布于 2015-08-01 21:50:27

现在,我的所有命令都只是在视图模型中作为属性列出,或者加载到VM的构造函数中,或者延迟加载。

不是为ViewModel中的每个命令创建不同的属性,而是尝试使用单个集合属性Commands来保存ViewModel中的所有命令。

这样,您只需在ViewModel构造函数中创建所有命令并将其添加到Commands集合中,甚至可以从ViewModel构造函数外部的工厂方法中创建和添加所有命令。

无论如何,从代码可读性/可维护性以及功能的角度来看,关于处理命令有什么想法?

  1. 95%的情况下,不需要区分ViewModel.
  2. It's中的命令更容易维护一个集合属性,该属性可以轻松地组合并映射到工具栏或分层上下文菜单中以维护ViewModel.
  3. Commands集合中的许多属性。
  4. 在不更改现有类或子类的情况下向ViewModel添加命令的功能真的很棒。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24110879

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档