我有一个包含 AvalonEditor 控件的 EditorViewModel
。我绑定(bind)到 Document
的 SelectionLength
和 SelectionStart
属性,大家都很高兴;我可以使用更新代码隐藏值的鼠标选择文本,反之亦然。这就是问题所在,我正在调用一个 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
时从 AvalonEdit 抛出和 ArgumentOutOfRangeException
;看起来 EditorViewModel
没有绑定(bind)到底层的 AvalonEditor 控件。
但是,当我注释掉有问题的代码并添加一个按钮以在代码文件打开后“手动”进行选择时
public void Test()
{
EditorViewModel evm = GetOpenEditorViewModels().FirstOrDefault();
if (evm != null)
{
ActivateItem(evm);
evm.SelectLine(1);
}
}
选择工作正常。为什么 AvalonEditor 控件似乎没有在回调中立即绑定(bind)到我的属性,我在做什么明显是错误的吗?
最佳答案
你能确认它正在 UI 线程上被回调吗?
如果任务中有中断点,VS 调试器中的线程窗口会告诉您什么?
我会考虑使用 Dispatcher.Invoke 方法而不是 Task:
Application.Current.Dispatcher.Invoke(() =>
{
// to do something
});
就我个人而言,我会考虑使用 Reactive Extensions (Rx .Net) 来完成所有这些工作,它能够比 Task IMO 更好地管理调度程序。
关于c# - 使用 MVVM 在运行时绑定(bind)失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24930935/