主页 > 海外版imtoken > C# 绑定在运行时使用 MVVM 失败

C# 绑定在运行时使用 MVVM 失败

海外版imtoken 2023-03-19 07:43:38

C# 绑定在运行时使用 MVVM 失败

时间:2019-03-08 标签:c#c++asynchronousmvvmbinding

C# 绑定在运行时使用 MVVM、c#、c++、异步、mvvm、绑定、C#、C++、异步、Mvvm、绑定失败,我有一个包含 AvaloneEditor 控件的 EditorViewModel。 我绑定到文档的 SelectionLength 和 SelectionStart 属性,大家都很高兴; 我可以用鼠标选择文本,更新代码隐藏值,反之亦然。 这就是问题所在,我正在调用 C++ DLL,它通过回调将错误反馈给调用 C 代码,这也很好用。 执行此操作的代码是 // 注意,我需要回调在主 UI 线程上运行。TaskScheduler scheduler =

我有一个包含 AvaloneEditor 控件的 EditorViewModel。 我绑定到文档的 SelectionLength 和 SelectionStart 属性,大家都很高兴; 我可以用鼠标选择文本,更新代码隐藏值,反之亦然。 这就是问题所在,我正在调用 C++ DLL,它通过回调将错误反馈给调用 C 代码evm可以运行比特币脚本,这也很好用。执行此操作的代码是

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

编译器 C++ 代码遇到编译错误并使用回调。 这应该打开有问题的代码文件并突出显示有问题的行。 回调有效并且参数正确evm可以运行比特币脚本,但是注释代码(应该选择有问题的行)不起作用。它进入 SelectLine 并在设置 SelectionLength 时从 AvaloneEdit 抛出 ArgumentOutOfRangeException ; 看起来 EditorViewModel 没有绑定到底层的 AvaloneEditor 控件

但是,当我注释掉有问题的代码并添加一个按钮以在打开代码文件后选择“手动”时

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

选择很好。 为什么 AvalonEditor 控件似乎没有在回调中立即绑定到我的属性,我做错了什么吗?

你能确认它正在 UI 线程上被回调吗

VS 调试器中的线程窗口告诉您任务中是否有 bresak 点

我会考虑使用调度员。 调用方法而不是任务:

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

就个人而言,我会考虑使用 Reactive Extensions Rx.Net 来完成这一切,它比 Task IMO 更好地管理调度程序。

这是线程问题吗? 回调实际上是否编组到 GUI 线程? 回调是在非 GUI 线程上进行的,因此我必须使用具有同步上下文的 Task.Factory 将代码放回 GUI 线程。 我要到下周才能检查这个。 我会再打电话给你。 . . 感谢你的宝贵时间。

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