C # — ошибка привязки во время выполнения с использованием MVVM

у меня есть EditorViewModel который содержит элемент управления AvalonEditor. Я связываю с SelectionLength а также SelectionStart свойства Document и все счастливы; Я могу выбрать текст как мышью, которая обновляет значения кода, так и наоборот. Вот проблема, я вызываю C ++ DLL, которая отправляет ошибки обратно в вызывающий код C # через обратный вызов, это тоже хорошо работает. Код для этого

// Note, I need the call back to run on the main UI thread.
TaskScheduler scheduler = TaskScheduler.FromCurrentSynchronizationContext();
Callbacks.CompilerErrorCallback =
(message, documentPath, lineNumber) =>
{
string path = String.Empty;
Task.Factory.StartNew(async () =>
{
// Open the erronious file and scroll to line.
path = Path.Combine(
WorkingDirectory, String.Format("GDLCode\\{0}", documentPath));
Open(path);
//EditorViewModel evm = GetOpenEditorViewModels()
//  .FirstOrDefault(vm => vm.FullFilePath.CompareNoCase(path));
//if (evm != null)
//{
//  ActivateItem(evm);
//  evm.SelectLine(lineNumber + 1);
//}

// Display error.
await dialogManager.ShowDialog<MessageDialogResult>(
new MessageBoxViewModel("GDECore Logic Compilation Error",
message,
settings));
return;
}, CancellationToken.None,
TaskCreationOptions.None,
scheduler);
};

// Run the C++ code below and pass in the `Callbacks.CompilerErrorCallback` object.

В EditorViewModel я имею

public void SelectLine(int lineNumber)
{
DocumentLine line = Document.GetLineByNumber(lineNumber);
SelectionStart = line.Offset;
SelectionLength = line.Length;
}

Компилятор (код C ++) обнаруживает ошибку компиляции и использует обратный вызов. Предполагается, что это откроет файл с нарушением кода и выделит строку с нарушением. Обратный вызов работает, и параметры правильны, однако код, который закомментирован (который должен выбрать ошибочную строку), не работает. Это входит в SelectLine и при настройке SelectionLength броски и ArgumentOutOfRangeException от AvalonEdit; это выглядит как EditorViewModel не привязан к базовому элементу управления AvalonEditor.

Тем не менее, когда я закомментирую код ошибки и добавлю кнопку, чтобы сделать выбор «вручную» после открытия файла кода

public void Test()
{
EditorViewModel evm = GetOpenEditorViewModels().FirstOrDefault();
if (evm != null)
{
ActivateItem(evm);
evm.SelectLine(1);
}
}

Выбор работает отлично. Почему элемент управления AvalonEditor, по-видимому, не связывается с моими свойствами сразу в обратном вызове, что я делаю, что явно неправильно?

0

Решение

Можете ли вы подтвердить, что он вызывается обратно в потоке пользовательского интерфейса?

О чем говорит окно потоков в отладчике VS, если у вас есть точка взлома в задании?

Я хотел бы рассмотреть возможность использования метода Dispatcher.Invoke вместо Task:

Application.Current.Dispatcher.Invoke(() =>
{
// to do something
});

Лично я бы посмотрел на использование Reactive Extensions (Rx .Net), чтобы сделать все это, у него есть способность управлять планировщиками намного лучше, чем Задача IMO.

1

Другие решения


По вопросам рекламы [email protected]