6

最初に私が始めていたコード:

<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はのタイプであるため、これもランタイムエラーを発生させますImageSmallImageSource値がのタイプであることを期待しますImageSource

ここで、データコンテキストを動的リソースに設定し、プロパティを適切にバインドすることをお勧めします。そうすると、IsEnabled別の。を持つプロパティのバインディングを強制終了しますDataContext

そして、私が知る限り、MultiBindingこれはいくつかのソースに対してプロパティをバインドするメカニズムを提供しますが、異なるコンテキストやソースに対して異なるプロパティをバインドするメカニズムを提供しないため、解決策でもありません。

乗り方を考えているうちに、ラッキーなことにImageSourceリグマロールをに移動できることに気づきましたIValueConverter。私の与えられたデータコンテキストでは、RibbonMenuButton実際には私のソースでもある適切な値を持つ文字列値がありますImageSource

とにかく、他のアプローチがなかった場合、つまり両方のソースが異なるデータコンテキストにあった場合、どのように問題を解決できるのか疑問に思っています。見えないものはありますか?DataContext動的リソースのプロパティに対するバインディングを上書きして、他のバインディングを強制終了しないようにするにはどうすればよいですか?


これは、 DrawingImagemsdnページimageSourceのXAMLの例とほとんど同じです。

<Image x:Key="imageSource">
  <Image.Source>
    <DrawingImage>
...
4

1 に答える 1

1

ImageSourceの代わりに「imageResource」を定義してみてくださいImage。これは私のために働きます。

<r:RibbonWindow
    x:Class="WpfApplication1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:r="clr-namespace:Microsoft.Windows.Controls.Ribbon;assembly=RibbonControlsLibrary"
    xmlns:pc="clr-namespace:System.Windows.Media;assembly=PresentationCore">
    <Grid>
        <Grid.Resources>
            <pc:ImageSource x:Key="imageSource">your_image.png</pc:ImageSource>
        </Grid.Resources>
        <r:Ribbon>
            <r:RibbonMenuButton
                IsEnabled="{Binding ForegroundIsConfigurable}"
                SmallImageSource="{DynamicResource imageSource}">
            </r:RibbonMenuButton>
        </r:Ribbon>
    </Grid>
</r:RibbonWindow>

また、次のようにElementNameバインディングを使用して、IsEnabledをオーバーライドせずにRibbonMenuButtonのDataContextを設定できます。

<r:RibbonWindow x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:r="clr-namespace:Microsoft.Windows.Controls.Ribbon;assembly=RibbonControlsLibrary"
        Title="MainWindow" Height="350" Width="525">

    <Grid x:Name="root">

        <Grid.Resources>
            <Image x:Key="imageSource" Source="{Binding myImageSource}"/>
        </Grid.Resources>

        <r:Ribbon>
            <r:RibbonMenuButton DataContext="{DynamicResource imageSource}"
                IsEnabled="{Binding ElementName=Root, Path=DataContext.ForegroundIsConfigurable}"
                SmallImageSource="{Binding Source}"/>
        </r:Ribbon>
    </Grid>
</r:RibbonWindow>
于 2013-03-26T20:14:22.047 に答える