c# - 使用 MVVM 在运行时绑定(bind)失败

标签 c# c++ asynchronous mvvm binding

我有一个包含 AvalonEditor 控件的 EditorViewModel。我绑定(bind)到 DocumentSelectionLengthSelectionStart 属性,大家都很高兴;我可以使用更新代码隐藏值的鼠标选择文本,反之亦然。这就是问题所在,我正在调用一个 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/

相关文章:

c++ - 设备驱动程序库

php - 由于 AJAX 请求,托管服务提供商阻止用户

android - 使用 AsyncTask 发送 Android 邮件

c# - 需要遍历 SQL 表行,一次一个(表太大而无法使用适配器。填充)

C# 相当于 Python 的 itertools.chain

c# - 如何在 .Net Core 中读取/写入文件?

c# 异步 curl 请求 - 如何访问响应?

c++ - 来自 C++ 的 SQLite 多插入只是添加第一个

c++ - 什么事件用于最大化/最小化?

javascript - 使用 Webworker 将 Javascript 函数作为线程调用