「Androidは電気羊の夢を見るか」を読みたい管理者のブログ

仕事などでの色々な発見を記事にしてます。不定期更新。

DataTriggerがようやく理解できた話


DataTriggerの使い方(WPF)|Memeplexes

サンプルソースをわかり易く書き直してみたのです。

    <Page.DataContext>
        <ViewModel:Viewmodel/>
    </Page.DataContext>
    <Page.Resources>
        <!--TextBlockのStyleだけどここで定義しないと上手く動かないらしい-->
        <Style x:Key="style" TargetType="TextBlock">
            <Style.Triggers>
                <DataTrigger Binding="{Binding IsChecked}" Value="true">
                    <Setter Property="Text" Value="Checked!!"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </Page.Resources>
    <StackPanel>

        <TextBlock Style="{StaticResource style}"/>


        <!--プロパティの値を変化させるコマンド-->
        <Button Command="{Binding Path=Change}">押す</Button>
    </StackPanel>

DataTriggerが何をやってるかと言えば一言で言ってしまえば
プロパティの値が書き換わった瞬間にSetterを呼んでる
ってことになるのですね。

で、見るプロパティの指定は

Binding="{Binding IsChecked}"

で指定
Setterで何を変えるかといえば
そのStyleが適用されてるコントロール
ViewModelのプロパティの値→View
となるわけで。
プロパティの値を変化させる要因は言ってしまえばなんだっていいのです。
ポイントはDataTriggerのターゲットとなるコントロールのStyleにDataTriggerを設定する、
という所かと思います。
で、そのことをわかり易くするために以下のように書き直したんですが

        <TextBlock>
            <TextBlock.Resources>
                <Style x:Key="style" TargetType="TextBlock">
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding IsChecked}" Value="true">
                            <Setter Property="Text" Value="Checked!!"/>
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </TextBlock.Resources>
        </TextBlock>

動かない。

INotifyPropertyChanged継承してOnPropertyChangedも呼んでるのに動かない。

バグでしょうか。

そんなわけなのです。