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は反映されずボタンは消えたままです。
とりあえずコレで良しとします。