【问题标题】:WinUI 3 Desktop XAML Databinding - WinRT originate error - 0x8001010E when the Property is changedWinUI 3 桌面 XAML 数据绑定 - WinRT 发起错误 - 更改属性时出现 0x8001010E
【发布时间】:2021-11-05 15:48:00
【问题描述】:

我正在关注 BookStore 数据绑定示例,记录在 XAML controls; bind to a C++/WinRT property,直到并包括“将按钮绑定到 Title 属性”部分。

我的起点是 Visual Studio 中的一个新的“Blank App, Packaged (WinUI 3 in Desktop)”项目。

[编辑] 从用于 UWP 应用的“空白应用 (C++/WinRT)”项目开始,可以完美运行。 “桌面中的 WinUI 3”项目仍然存在此问题。

初始数据绑定有效,按钮内容L"Atticus" 是从 BookSku 标题属性中读取的。但是,按照文章中的指示在点击处理程序中调用 MainViewModel().BookSku().Title(L"To Kill a Mockingbird"); 会引发异常

Exception thrown at 0x00007FFC801B4ED9 (KernelBase.dll) in BookStore.exe: WinRT originate error - 0x8001010E : 'The application called an interface that was marshalled for a different thread.'.

单步执行代码,调用

m_propertyChanged(*this, Windows::UI::Xaml::Data::PropertyChangedEventArgs{ L"Title" });

in void BookSku::Title(hstring const& value) 是从内部引发异常的地方。

我可以手动更改按钮内容,而不是通过绑定属性。

Data binding in depth 文章中的第一个示例描述了一个非常相似的数据绑定场景,虽然稍微简单一些。它抛出相同的异常。

我正在使用最新的 Microsoft.Windows.CppWinRT 版本 2.0.210825.3 和 Windows App SDK 版本 0.8.3

【问题讨论】:

    标签: c++ windows-runtime winrt-xaml c++-winrt


    【解决方案1】:

    这个问题#4547 是找出解决方案的关键。您需要使用Microsoft 命名空间,而不是Windows。出于文档目的,BookSku.idl 文件应如下所示:

    // BookSku.idl
    namespace Bookstore
    {
        runtimeclass BookSku : Microsoft.UI.Xaml.Data.INotifyPropertyChanged
        {
            BookSku(String title);
            String Title;
        }
    }
    

    【讨论】:

    • 我看到你已经解决了你的问题,请mark它被接受
    【解决方案2】:

    应用程序调用了一个为不同线程编组的接口

    问题是你在no-uithread中更新了属性,所以会抛出上面的异常,你可以在更新属性之前使用下面的方法回到ui-thread。

    co_await winrt::resume_foreground(Dispatcher(), CoreDispatcherPriority::Normal);
    

    更多详情请参考document here

    【讨论】:

    • 您好,感谢您的回复。 Dispatcher() 正在返回一个未初始化的对象,因此 resume_forground 正在抛出“访问冲突读取位置 0x0000000000000000”。我意识到指出这是一个“桌面中的 WinUI 3”项目而不是 UWP 可能很重要,所以我在问题中添加了这个细节。此外,如果它很重要,我可以手动更改按钮内容,而不是通过绑定属性。那么这是否意味着我已经在没有resume_forground 的正确线程上?我也在问题中添加了该注释。
    • 作为后续。我尝试遵循从“空白应用程序(C++/WinRT)”项目开始的指南,该项目适用于 UWP 应用程序。有了它,一切都完美无缺。
    • 最后一条评论,我弄明白了,和命名空间不同有关。
    猜你喜欢
    • 2021-09-28
    • 2016-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-11
    • 1970-01-01
    • 2023-03-16
    • 2013-12-13
    相关资源
    最近更新 更多