GalaSoft MvvmLight RelayCommand перестает работать при доступе к закрытию

Я борюсь с использованием GalaSoft.MvvmLight.RelayCommand. Все работает нормально, пока я не попытаюсь получить доступ к закрытию. Я не получаю никакой ошибки или вывода журнала.

Этот код работает:

 for (int i = 0; i < 3; i++)
            {
                var iTemp = i;

                var command = new RelayCommand(() =>
                {
                    Debug.WriteLine("executed");

                    Debug.WriteLine(this);

                    // Debug.WriteLine(iTemp);
                });
                Commands[i.ToString()] = command;
                children.Add(dataTemplateCreator.BuildButtonWithCommand(0, gridRow, $"Commands[{i}]", i.ToString()));

                gridRow++;
            }

Как только я удаляю комментарий, команда больше не выполняется. Кто-нибудь видел такое поведение раньше?

Я тоже попробовал проще

Работает:

Execute = new RelayCommand(() =>
        {
            Value += 3;

        });

Перестает работать:

 var incValue = 3;

            Execute = new RelayCommand(() =>
            {
                Value += incValue;

            });

0 ответов

Вы, несомненно, решили это или продолжили, но ваша проблема - сборка мусора.

Проблема описана в этом ответе на переполнение стека, а решение описано в этом элементе документации MVVMLight.

Вкратце: действие команды и функция включения, которую вы передаете RelayCommand хранятся со слабыми ссылками, поэтому, если что-то кроме RelayCommandдержится за них, в какой-то момент они будут собраны мусором. Решение - использоватьkeepTargetAlive параметр конструктора, если ваше действие или функция включения являются закрытием.

Другие вопросы по тегам