WPFのXAMLを書いていた時にハマったのでメモ。
Visibilityをバインドしたかった
自作のUserControlのVisibilityをバインドするコードを書きました。
MyUserControlVisibilityを通じて、MyUserControlのVisibilityを変更出来るようにしようとしています。
MainWindow.xaml
...
<local:MyUserControlVisibility="{Binding MyUserControlVisibility, Mode=TwoWay}"/>
...
MainWindow.xaml.cs
.../// Prism使用publicclassMainWindowViewModel:BindableBase{...privateVisibility_MyUserControlVisibility=Visibility.Hidden;publicVisibilityMyUserControlVisibility{get{return_MyUserControlVisibility;}set{SetProperty(ref_MyUserControlVisibility,value);}}...}...
しかし、これでは動作しません。無視されます。
DataTriggerに書き換えてみる
DataTriggerで発火させれば動くのではと思い、書き換えてみます。
MainWindow.xaml
...
<local:MyUserControl><local:MyUserControl.Style><StyleTargetType="local:MyUserControl"><!--TargetTypeをUserControlにしても変わらない--><SetterProperty="Visibility"Value="Visible"/><Style.Triggers><DataTriggerBinding="{Binding MyUserControlVisibility}"Value="Hidden"><SetterProperty="Visibility"Value="Hidden"/></DataTrigger></Style.Triggers></Style></local:MyUserControl.Style></local:MyUserControl>
...
が、あえなく撃沈。またもや無視されてしまいます。
(一応解決)Gridに入れる
目的のUserControlをGridに入れて、GridのVisibilityをバインドしてみます。
MainWindow.xaml
...
<GridVisibility="{Binding MyUserControlVisibility, Mode=TwoWay}"><local:MyUserControl/></Grid>
...
これだと希望通りの動作をしてくれました。が、Gridで挟むって……これで良いんですかね?
終わりに
自作UserControlに限ってバインドがうまくできないのですが、バグなのでしょうか。それとも仕様?
Gridに入れるという解決法は私もあまりしっくり来ていません。もっと良い書き方をご存知の方は教えて頂けると嬉しいです。
また、WPFのXAMLはBinding関連でエラーが起こっても基本的に例外を吐かない仕様なので、デバッグには非常に苦慮します。Warningくらい出してくれても良いのにとよく思うのですが。MSさん、いかがでしょう?