0

C ++ /CxWinRTプロジェクトに添付プロパティを作成したいと思います。そうすると、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:要素'Grid'の不明なアタッチ可能なメンバー'VisualStateManagerBindingHelper.State'

XAMLコンパイラは、この添付プロパティが許可されているというヒントをどこかで取得することになっているように見えますが、そのヒントを与える方法がわかりません。同じテーマに関するこの記事は、DependancyPropertyを公開する必要があることを示唆しています。C++でそれを行う方法が完全にはわかりません。

私の最終的な目標は、ビジュアルステートグループの状態をビューモデルプロパティにバインドすることです。これを行う方法は、この質問で受け入れられた回答に概説されています。残念ながら、そこに提供されているコードにはC#があり、C++に正しく変換できないようです。

最後に、Visual Studioの新しいプロジェクトテンプレートに付属しているSuspensionManagerが、私とほぼ同じようにアタッチされたプロパティを定義していることに気付きましたが、使用例は示されていません。これにより、私は順調に進んでいるように感じますが、パズルの小さなピースが欠けています。

4

1 に答える 1

0

私の質問に答えるサイトを見つけました!私が推測したように、XAMLプリプロセッサがアタッチされたプロパティを認識できるように、クラスを非常に特殊な方法で定義する必要があります。すべての要件とコードサンプルは、こちらから入手できます。

于 2012-11-16T06:51:38.787 に答える