在带有“C++/WinRT”的“WinAppSDK”桌面应用程序中使用单向数据绑定时发生异常

问题描述 投票:0回答:1

我不知道如何在我的

C++/WinRT
Windows App SDK
桌面项目中使用 OneWay 数据绑定,因为没有官方指南,也没有演示项目。

每次运行我的应用程序后,它总是崩溃,但有关

XAML
编译的异常。并且输出窗口中有一行警告:

XamlCompiler warning WMC1506: OneWay bindings require at least one of their steps to support raising notifications when their value changes.

我注意到很多

WinUI in Desktop
几年前的
C++/WinRT
项目与今天的项目有很大不同,所以我无法真正学习他们的经验。

起初我遵循

UWP
文档中的C++/WinRT
进行数据绑定,但发现它不适用于我的
WinAppSDK
项目。

我在 Github issues 下找到了关于

UWP/WinUI3

 项目的熟悉答案:

在“生成”的输出窗口中,您是否看到一行显示 XamlCompiler warning WMC1506: OneWay 绑定至少需要其中一个步骤来支持在值更改时引发通知?您是否忘记实施 INotifyPropertyChanged?

但是,我在我的项目中实现了

INotifyPropertyChanged

 接口,如下所示:

// Message.idl namespace XXX { runtimeclass Message : Windows.UI.Xaml.Data.INotifyPropertyChanged { Message(String content); String Content; } }
// Message.cpp
void Message::Content(hstring const& value)
{
    if (m_content != value) {
        m_content = value;
        m_propertyChanged(*this, Windows::UI::Xaml::Data::PropertyChangedEventArgs{ L"Content" });
    }
}
<!---MainWindow.XAML--->
<TextBox x:Name="textBoxProducer" 
    Text="{x:Bind MainViewModel.MessageProducer.Content, Mode=OneWay}" .../>
每当我想在运行时更改 

TextBox

 的文本时,如下所示:

MainViewModel().MessageProducer().Content(L"Start Produing...");
然而它不起作用。


TextBox

的文字不会改变,但会出现异常导致应用程序崩溃。

data-binding window winui-3 windows-app-sdk
1个回答
0
投票
我刚刚跨过上述警戒线

它报告警告的原因是

我正在使用构造函数来创建对象,而不是使用winrt::make


Windows App SDK

的代码组织与
UWP
的代码组织完全不同。在我的实践中,我做了一些改变,以便我的项目能够发挥作用。当时我还没有意识到使用
winrt::make
的意义。

偶然忘记包含一些库,导致编译错误,所以我用构造函数替换了winrt::make

部分。

ChatGPT

 已澄清,在 
Windows App SDK/WinUI3
 应用程序中,UI 部分与后端服务在不同的线程上工作。并且
make
具有内置功能,可以在线程之间自动调整对象。

未处理的异常

winrt::make

恢复后,每当我想更改绑定数据时,应用程序仍然崩溃,但有以下例外:

The application called an interface that was marshalled for a different thread.
    
© www.soinside.com 2019 - 2024. All rights reserved.