WPF は null オブジェクトのプロパティへのバインディングをどのように処理しますか? 質問する

WPF は null オブジェクトのプロパティへのバインディングをどのように処理しますか? 質問する

次の行を含む itemTemplate を使用する listBox があります。

<Image Source="{Binding MyProperty.PossiblyNullObject.UrlProperty}"/> 

このリストボックスにバインドされているのは、コレクション内の項目のコンポーネントを別のスレッドで読み込むモデル ビュー コレクションです。合成エンジンによって XAML コードが最初にレンダリングされるときに、'PossiblyNullObject' に値が設定されていない可能性があります。

WPF はこれをどのように処理しますか? 既定値 (画像ソースがないので画像なし) を使用して続行しますか? 待機しますか? 値が初期化されたことを自動的に検出し、新しいソースで再レンダリングしますか? プログラムで 'MyProperty.PossiblyNullObject.UrlProperty' を呼び出した場合と同じように、オブジェクト null 例外をスローしないのはなぜですか? 呼び出しを試みたときに、自分のコードでこの機能を再現するにはどうすればよいですか?

ご提案をいただければ幸いです。恥ずかしながら、私は WPF 初心者で、自分の能力を超えた問題に取り組もうとしています。画像の読み込みはパフォーマンスの問題なので、バックグラウンド スレッドで画像ソースを読み込み、デコードし、フリーズして UI がロックされないようにするソリューションを見つけました。残念ながら、画像ソース バインディングを同じプロパティを呼び出すソリューションに置き換えようとしたときに、この null 例外の問題に遭遇しました。WPF は、考えられる null オブジェクトを何らかの方法で処理するので、クリーンな状態を保つために同じ方法で処理したいと思います。

ベストアンサー1

には、と のBindingBase2 つの特性があります。TargetNullValueFallbackValue

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>

詳細については、次のリンクを参照してください。

BindingBase.TargetNullValue プロパティ

BindingBase.FallbackValue プロパティ

おすすめ記事