[英]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.