次の行を含む itemTemplate を使用する listBox があります。
<Image Source="{Binding MyProperty.PossiblyNullObject.UrlProperty}"/>
このリストボックスにバインドされているのは、コレクション内の項目のコンポーネントを別のスレッドで読み込むモデル ビュー コレクションです。合成エンジンによって XAML コードが最初にレンダリングされるときに、'PossiblyNullObject' に値が設定されていない可能性があります。
WPF はこれをどのように処理しますか? 既定値 (画像ソースがないので画像なし) を使用して続行しますか? 待機しますか? 値が初期化されたことを自動的に検出し、新しいソースで再レンダリングしますか? プログラムで 'MyProperty.PossiblyNullObject.UrlProperty' を呼び出した場合と同じように、オブジェクト null 例外をスローしないのはなぜですか? 呼び出しを試みたときに、自分のコードでこの機能を再現するにはどうすればよいですか?
ご提案をいただければ幸いです。恥ずかしながら、私は WPF 初心者で、自分の能力を超えた問題に取り組もうとしています。画像の読み込みはパフォーマンスの問題なので、バックグラウンド スレッドで画像ソースを読み込み、デコードし、フリーズして UI がロックされないようにするソリューションを見つけました。残念ながら、画像ソース バインディングを同じプロパティを呼び出すソリューションに置き換えようとしたときに、この null 例外の問題に遭遇しました。WPF は、考えられる null オブジェクトを何らかの方法で処理するので、クリーンな状態を保つために同じ方法で処理したいと思います。
ベストアンサー1
には、と のBindingBase
2 つの特性があります。TargetNullValue
FallbackValue
TargetNullValue
ソースの値がヌル。
FallbackValue
バインディングが値を返すことができない場合に値を返します。
使用例:
<!-- xmlns:sys="clr-namespace:System;assembly=mscorlib" -->
<Window.Resources>
<!-- Test data -->
<local:TestDataForImage x:Key="MyTestData" />
<!-- Image for FallbackValue -->
<sys:String x:Key="ErrorImage">pack://application:,,,/NotFound.png</sys:String>
<!-- Image for NULL value -->
<sys:String x:Key="NullImage">pack://application:,,,/NullImage.png</sys:String>
</Window.Resources>
<Grid DataContext="{StaticResource MyTestData}">
<Image Name="ImageNull"
Width="100"
Height="100"
Source="{Binding Path=NullString, TargetNullValue={StaticResource NullImage}}" />
<Image Name="ImageNotFound"
Width="100"
Height="100"
Source="{Binding Path=NotFoundString, FallbackValue={StaticResource ErrorImage}}" />
</Grid>
詳細については、次のリンクを参照してください。