最初に私が始めていたコード:
<ribbon:RibbonMenuButton IsEnabled="{Binding ForegroundIsConfigurable}"
SmallImageSource="{Binding Source={StaticResource imageSource},
Path=Source,
UpdateSourceTrigger=OnPropertyChanged}">
このバインディングはコンパイルされて正常に実行されていますが、私が満足していない理由は、imageSource
実行時に変更されるためです。
StaticResource Markup Extension:定義済みのリソースへの参照を検索することにより、XAMLプロパティ属性の値を提供します。そのリソースのルックアップ動作は、現在のXAMLページのマークアップおよび他のアプリケーションソースから以前にロードされたリソースを検索し、実行時にプロパティ値としてそのリソース値を生成するロード時ルックアップに類似しています。 -時間オブジェクト。
imageSource
実行時に値が変更されるため、に変更するStaticResource
必要がありましたDynamicResource
。ただし、このプロパティSource
は依存関係プロパティではないため、次のコードでランタイムエラーが発生します。
SmallImageSource="{Binding Source={DynamicResource imageSource},
Path=Source,
UpdateSourceTrigger=LostFocus}
そのため、動的リソースをSmallImageSource
依存関係プロパティであるに直接バインドする必要があります。
SmallImageSource="{DynamicResource imageSource}"
imageSource
はのタイプであるため、これもランタイムエラーを発生させますImage
。SmallImageSource
値がのタイプであることを期待しますImageSource
。
ここで、データコンテキストを動的リソースに設定し、プロパティを適切にバインドすることをお勧めします。そうすると、IsEnabled
別の。を持つプロパティのバインディングを強制終了しますDataContext
。
そして、私が知る限り、MultiBinding
これはいくつかのソースに対してプロパティをバインドするメカニズムを提供しますが、異なるコンテキストやソースに対して異なるプロパティをバインドするメカニズムを提供しないため、解決策でもありません。
乗り方を考えているうちに、ラッキーなことにImageSource
リグマロールをに移動できることに気づきましたIValueConverter
。私の与えられたデータコンテキストでは、RibbonMenuButton
実際には私のソースでもある適切な値を持つ文字列値がありますImageSource
。
とにかく、他のアプローチがなかった場合、つまり両方のソースが異なるデータコンテキストにあった場合、どのように問題を解決できるのか疑問に思っています。見えないものはありますか?DataContext
動的リソースのプロパティに対するバインディングを上書きして、他のバインディングを強制終了しないようにするにはどうすればよいですか?
これは、 DrawingImagemsdnページimageSource
のXAMLの例とほとんど同じです。
<Image x:Key="imageSource">
<Image.Source>
<DrawingImage>
...