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
параметр конструктора, если ваше действие или функция включения являются закрытием.