我想在我的 C++/Cx WinRT 项目中创建一个附加属性。当我这样做时,XAML 编译器会抱怨我正在使用未知属性。
我在 cpp 文件中声明我的附加属性:
/*--------------------------------------------------------------------
Forward Declarations
--------------------------------------------------------------------*/
namespace
{
void
StateChanged(
DependencyObject^ target,
DependencyPropertyChangedEventArgs^ args);
}
/*--------------------------------------------------------------------
DependancyProperty setup for the view model
--------------------------------------------------------------------*/
namespace
{
DependencyProperty^ _stateProperty =
DependencyProperty::RegisterAttached(
"State",
TypeName(Platform::String::typeid),
TypeName(VisualStateManagerBindingHelper::typeid),
ref new PropertyMetadata(nullptr, ref new PropertyChangedCallback(&StateChanged)));
}
namespace
{
void
StateChanged(
DependencyObject^ target,
DependencyPropertyChangedEventArgs^ args)
{
if (args->NewValue != nullptr)
{
VisualStateManager::GoToState(safe_cast<Control^>(target), safe_cast<String^>(args->NewValue), true);
}
}
}
在我的 XAML 文件中,我尝试使用附加的属性:
<UserControl
xmlns:local="using:MyCustomNamespace"
...
<Grid Grid.Column="1" local:VisualStateManagerBindingHelper.State="{Binding Path=SomeViewModelProperty, Mode=TwoWay}">
...
当我编译时,我遇到了这个错误:
XamlCompiler 错误 WMC0010:元素“网格”上的未知可附加成员“VisualStateManagerBindingHelper.State”
在我看来,好像 XAML 编译器应该在某处获得允许此附加属性的提示,但我不知道如何给出该提示。这篇关于同一主题的文章建议 DependancyProperty 应该是公开的。我不完全确定如何在 C++ 中做到这一点。
我的最终目标是将视觉状态组的状态绑定到某个视图模型属性。此问题的已接受答案中概述了执行此操作的方法。不幸的是,那里提供的代码是 C#,我似乎无法正确地将其转换为 C++。
最后,我注意到 Visual Studio 的新项目模板附带的 SuspensionManager 几乎和我一样定义了一个附加属性,但它们没有显示任何使用它的示例。这让我觉得自己走上了正轨,但错过了一小部分拼图。