繁体   English   中英

ICommands循环

[英]A loop of ICommands

我有一个ICommands循环(嗯,RelayCommand是从ICommand继承的),我不知道如何为每个ICommand提供信息。

我实际上正在做的是创建WPF上下文菜单,每个菜单项都有一个ICommand。 每个菜单项都需要做不同的事情。 它需要将单击的项目(字符)添加到一组项目(场景)。

如果显示出我认为的循环本身,将会更加清楚:

foreach (Scene s in Database.Instance.Scenes)
{
    SceneAddMenu.Add(new ContextMenuVM()
    {
        DisplayName = s.SceneName,
        ContextMenuCommand = new RelayCommand(
        () =>
        {
            MessageBox.Show("Clicked " + s.SceneID.ToString());

        })
    });
}

ContextMenuVM包含一个String(菜单项显示文本)和ContextMenuCommand,后者是RelayCommand(从ICommand继承)。

此刻,代码始终以列表中的最终场景ID运行。 我认为这是因为表达式是在运行时求值的(在那儿我可能完全错了),因此无论如何它都在循环的结尾。

我想要的是从每个循环外部(场景的)到循环内部获取信息。

我对这个问题的了解不足,无法再找到了。 我一直在搜索“ ICommand循环”,直到在Google上脸色发青为止,但我认为这些不是解决问题的正确方法。

任何帮助将不胜感激,甚至只是用于搜索的正确术语。

是! 那是关于捕获变量的问题。 所有内存引用都更新为保留的最后一个值变量。 您将不得不对其进行一些微调,但这是一个可以采取/尝试哪种替代方法的想法。

public class Program {
    public void Main() {
        var commands = new List<MenuCommand>();
        // Add commands
        for (int i = 1; i <= 3; i++) {
            commands.Add(new MenuCommand(MenuItemAction) { SceneId = i });
        }
        // Exec commands - Test
        foreach (var cmd in commands) {
            cmd.Execute(cmd.SceneId);
        }
    }

    public void MenuItemAction(object sceneId) {
        Console.WriteLine("Clicked: " + sceneId);
    }
}

public class MenuCommand : RelayCommand {
    public int SceneId { get; set; }

    public MenuCommand(Action<object> action) : 
        base(action) { 
    }
}

public class RelayCommand : ICommand {
    private Action<object> action;

    public RelayCommand(Action<object> action) {
        this.action = action;
    }

    public virtual void Execute(object parameter) {
        this.action(parameter);
    }
}

在循环内创建SceneID的副本:

foreach (Scene s in Database.Instance.Scenes)
{
    int id = s.SceneID;
    SceneAddMenu.Add(new ContextMenuVM()
    {
        DisplayName = s.SceneName,
        ContextMenuCommand = new RelayCommand(
        () =>
        {
            MessageBox.Show("Clicked " + id.ToString());

        })
    });
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM