かずきのBlog@hatena

日本マイクロソフトに勤めています。XAML + C#の組み合わせをメインに、たまにASP.NETやJavaなどの.NET系以外のことも書いています。掲載内容は個人の見解であり、所属する企業を代表するものではありません。

Windows 8.1のストアアプリのBehaviorでTriggerBehaviorを作る時の注意点

Actionsプロパティは依存プロパティとして実装しましょう。

何故?

依存プロパティとして実装しないと、ActionにBindingが出来なくなります。

Actionsが依存プロパティではなく、普通のプロパティの場合、以下のようにActionsの中のActionで{Binding}したときにDataContextが切れてnullが渡ってしまいます。

<Button Content="ClickEventTriggerBehvior and MainPageViewModelMessageDialogAction sample button" HorizontalAlignment="Left" Margin="120,176,0,0" Grid.Row="1" VerticalAlignment="Top">
    <Interactivity:Interaction.Behaviors>
        <Behaviors:ClickEventTriggerBehavior>
            <Behaviors:ClickEventTriggerBehavior.Actions>
                <Behaviors:MainPageViewModelMessageDialogAction TargetObject="{Binding}"/>
            </Behaviors:ClickEventTriggerBehavior.Actions>
        </Behaviors:ClickEventTriggerBehavior>
    </Interactivity:Interaction.Behaviors>
</Button>

愚痴

以下のようなプロパティの実装がお手本としてあるから、添付プロパティにしなくてもいいじゃん?って思って普通のプロパティとして実装してしまいがちだけど、そうするとActionでBindingできなくて死ぬ。

public ActionCollection Actions
{
    get
    {
        var actions = (ActionCollection)GetValue(ActionsProperty);
        if (actions == null)
        {
            actions = new ActionCollection();
            this.SetValue(ActionsProperty, actions);
        }
        return actions;
    }
}

いまいち。