使用MVVM在运行时绑定失败

时间:2014-07-24 10:12:18

标签: c# c++ asynchronous mvvm binding

我有一个EditorViewModel,其中包含一个AvalonEditor控件。我绑定了SelectionLength的{​​{1}}和SelectionStart属性,每个人都很开心;我可以用鼠标选择文本,更新代码隐藏值,反之亦然。这是问题,我正在调用一个C ++ DLL,它通过回调将错误编组回调用C#代码,这也很好用。执行此操作的代码是

Document

// 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

编译器(C ++代码)遇到编译错误并使用回调。这应该打开有问题的代码文件并突出显示有问题的行。回调有效且参数正确但是,注释的代码(应该选择违规行)不起作用。它进入public void SelectLine(int lineNumber) { DocumentLine line = Document.GetLineByNumber(lineNumber); SelectionStart = line.Offset; SelectionLength = line.Length; } 并设置SelectLine投掷和SelectionLength来自AvalonEdit;看起来ArgumentOutOfRangeException没有绑定到底层的AvalonEditor控件。

然而,当我对违规代码进行评论并添加一个按钮来进行选择时,手动&#39;代码文件打开后

EditorViewModel

选择工作正常。为什么AvalonEditor控件似乎没有在回调中立即绑定到我的属性,我正在做的事情显然是错误的吗?

1 个答案:

答案 0 :(得分:1)

你能否确认它在UI线程上被回调?

如果你在任务中有一个bresak点,VS调试器中的线程窗口会告诉你什么?

我会考虑使用Dispatcher.Invoke方法而不是Task:

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

就个人而言,我会考虑使用Reactive Extensions(Rx .Net)来完成所有这些工作,它能够比任务IMO更好地管理调度程序。