仕事で ComboBox1 の選択肢によって、ComboBox2 の内容を動的に変更するという要望があった。
ViewModel のプロパティを ComboBox の ItemsSource にバインドすれば良いかと実装。
ComboBox1 の値を変更したら、ComboBox2 の選択肢も変わって「よしよし」って思っていたら、裏でバインドエラーが出ていました。
System.Windows.Data Error: 4 : Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='System.Windows.Controls.ItemsControl', AncestorLevel='1''. BindingExpression:Path=HorizontalContentAlignment; DataItem=null; target element is 'ComboBoxItem' (Name=''); target property is 'HorizontalContentAlignment' (type 'HorizontalAlignment')
System.Windows.Data Error: 4 : Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='System.Windows.Controls.ItemsControl', AncestorLevel='1''. BindingExpression:Path=VerticalContentAlignment; DataItem=null; target element is 'ComboBoxItem' (Name=''); target property is 'VerticalContentAlignment' (type 'VerticalAlignment')
長くて折り返して表示してますが、2行のメッセージが表示されました。
しかも質の悪いことに、コンボボックス内に表示したアイテムの数分発生している。100件のアイテムがあったら、上記のエラーが100個、合計200個のエラーが出てくる。
動いているから無視しようかとも思いましたが、エラーを放置することが出来ずに調べたので備忘録です。
バインドエラー (バインディングエラー)
このバインディングエラー(BindingExpression)というのが曲者で、パフォーマンスに悪影響を与えることがあります。
上記の問題を調べると、既知の問題で動的に作成されたリストを含むコントロールすべてで発生するようです。つまりは、ComboBox、ListBox、メニューなどでも発生し得ると。
解決方法
解決策としては、Item の Style を設定すれば良いようです。
<Style TargetType="ComboBoxItem">
<Setter Property="HorizontalContentAlignment" Value="Left"/>
<Setter Property="VerticalContentAlignment" Value="Center"/>
</Style>
昔からある問題みたいなんで、対処してくれればいいのに。。
コメント