我不知道如何在我的
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
的文字不会改变,但会出现异常导致应用程序崩溃。
我正在使用构造函数来创建对象,而不是使用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.