Quantcast
Channel: C#タグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 9551

【WPF XAML】自作UserControlのプロパティはバインドできない?

$
0
0

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さん、いかがでしょう?


Viewing all articles
Browse latest Browse all 9551

Trending Articles