0

我想在我的 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 几乎和我一样定义了一个附加属性,但它们没有显示任何使用它的示例。这让我觉得自己走上了正轨,但错过了一小部分拼图。

4

1 回答 1

0

我找到了一个回答我问题的网站!正如我所怀疑的,您需要以非常特定的方式定义您的类,以便 XAML 预处理器了解您的附加属性。此处提供了所有要求以及代码示例。

于 2012-11-16T06:51:38.787 回答