PR

[C#][WPF]ComboBox の選択肢を動的に設定したら Binding Error になった

C#

仕事で 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>

昔からある問題みたいなんで、対処してくれればいいのに。。

コメント

タイトルとURLをコピーしました