見出し画像

XamDataGrid:TemplateFieldに配置したボタンのVisible変えるくらいでバリューコンバータなんて作りたくないのでAIに頼る

バリューコンバータって作るのと設定が面倒なのでなるべく作りたくないです。
今回はXamDataGridのTemplateFieldに配置したInvoiceの登録ボタンの表示/非表示をInvoice No.が登録されていたら非表示、Nullだったらボタンを表示するってお題です。

<Button.Style>の<Style.Triggers>にDataTriggerを設定します。

<DataTrigger Binding="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type igDP:CellValuePresenter}}, Path=DataContext.DataItem.INVOICE_NO}" Value="{x:Null}">
    <Setter Property="Visibility" Value="Visible" />
</DataTrigger>

Value="{x:Null}"でNullだった場合のトリガーはできましたが、Not Nullってどーするのよ???
こういう時に頼りになるCopilotに聞いてみる。
数秒で答えてくれたのが以下のコード。

<Button.Style>
    <Style TargetType="Button">
        <Style.Triggers>
            <MultiDataTrigger>
                <MultiDataTrigger.Conditions>
                    <Condition Binding="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type igDP:CellValuePresenter}}, Path=DataContext.DataItem.INVOICE_NO}" Value="{x:Null}" />
                </MultiDataTrigger.Conditions>
                <Setter Property="Visibility" Value="Collapsed" />
            </MultiDataTrigger>
            <MultiDataTrigger>
                <MultiDataTrigger.Conditions>
                    <Condition Binding="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type igDP:CellValuePresenter}}, Path=DataContext.DataItem.INVOICE_NO}" Value="{x:Null}" />
                </MultiDataTrigger.Conditions>
                <Setter Property="Visibility" Value="Visible" />
            </MultiDataTrigger>
        </Style.Triggers>
    </Style>
</Button.Style>

いや、だめなのわかるわ一発で。
その後もAIと色々話し合って出してきた答え

<Button.Style>
    <Style TargetType="Button">
        <Style.Triggers>
            <!-- INVOICE_NOがNullの場合 -->
            <DataTrigger Binding="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type igDP:CellValuePresenter}}, Path=DataContext.DataItem.INVOICE_NO}" Value="{x:Null}">
                <Setter Property="Visibility" Value="Visible" />
            </DataTrigger>
            <!-- INVOICE_NOがNullでない場合 -->
            <DataTrigger Binding="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type igDP:CellValuePresenter}}, Path=DataContext.DataItem.INVOICE_NO, TargetNullValue=''}" Value="">
                <Setter Property="Visibility" Value="Collapsed" />
            </DataTrigger>
        </Style.Triggers>
    </Style>
</Button.Style>

アホなのか???Nullの場合と同じじゃないか?
時間の無駄だ、できないならできないと正直に言え、と責めると

人間らしいと言えば、そうなのだが。

と逃げやがる。誰がこんなこと機械学習させたんだ。
Microsoftが誇るAIも匙を投げたので、自力で解決しました。

<Button.Style>
    <Style BasedOn="{StaticResource MaterialDesignFlatButton}" TargetType="Button">
        <Style.Triggers>
            <DataTrigger Binding="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type igDP:CellValuePresenter}}, Path=DataContext.DataItem.INVOICE_NO}" Value="{x:Null}">
                <Setter Property="Visibility" Value="Visible" />
            </DataTrigger>
        </Style.Triggers>
        <Setter Property="Visibility" Value="Collapsed"/>
    </Style>

DataTrigger以外のところにデフォルトで非表示にしておくと、DataTriggerが上書きするのでしょうか?? ちなみにButtonそのもののVisibilityを非表示にしておくとDataTriggerは反映されずボタンは消えたままです。

とりあえずコレで良しとします。