RelayCommand или передача Action <T>ведут себя иначе, когда метод от интерфейса? - PullRequest
0 голосов
/ 24 июня 2010

Я думаю, что это моя общая неопытность .NET, говоря здесь, но я не могу понять, почему это происходит со мной.

Моя модель ImportMany с интерфейсом под названием ISystemSetupEditor, и в этом случае у меня естьпара частей, которые Export этот интерфейс.

В ViewModel приложения у меня есть метод, который создает меню и перебирает IEnumerable<ISystemSetupEditor> для заполнения пунктов меню, например:

private ObservableCollection<WPFMenuItem> CreateSystemSetupItems()
{
    ObservableCollection<WPFMenuItem> menu = new ObservableCollection<WPFMenuItem>();

    foreach(ISystemSetupEditor editor in _model.SystemSetupEditors) {
        WPFMenuItem menuitem = new WPFMenuItem( editor.GetName());
        menuitem.Command = new RelayCommand( () => editor.ShowTool());
        menu.Add( menuitem);
    }

    return menu;
}

Проблема в том, что, когда я нажимаю любой элемент меню , всегда вызывается ShowTool () для последнего перечисленного объекта, производного от ISystemSetupEditor.Это как если бы каждая RelayCommand сохраняла одну и ту же ссылку.

Я надеялся, что кто-то может:

  • объяснить, почему это происходит, или, по крайней мере, дать мне ключевое слово, чтобы яЯ могу найти его и выяснить это самостоятельно.
  • Представить возможные решения - единственное, что я до сих пор придумал, - это управлять отдельным Словарём, где T, U сможет разрешитьправильная библиотека, поэтому нужную функцию можно вызвать позже.

1 Ответ

1 голос
/ 24 июня 2010

Вот как в основном работают замыкания и циклы в c #.

Взгляните на хорошее объяснение здесь

...