4

メニューを含む UserControl があります。Menu.Icon を UserControl のプロパティにバインドする必要がありますが、機能していません。

コードは次のように始まります -

        <Border Grid.Row="0">            
        <DockPanel>
            <Image x:Name="testImage" Height="16" Width="16" Source="{Binding ElementName=UC,Path=AddImage}"/>
            <Menu DockPanel.Dock="Left" Height="20"
              VerticalAlignment="Center">
                <MenuItem Header="{Binding ElementName=UC,Path=AddText}">
                    <MenuItem.Icon>
                        <!--<Image x:Name="workswhenin" Height="16" Width="16" Source="pack://application:,,/Kowdox;component/Images/UserIcons/user_add.png"/>-->

                        <Image x:Name="realImage" Height="16" Width="16"
                        Source="{Binding ElementName=UC,Path=AddImage}"/>
                    </MenuItem.Icon>
                </MenuItem>

宣言された最初のイメージ (testImage) は完全に機能するので、バインディングが正しいことを嬉しく思います。2 番目のイメージ (コメント アウトされ、'workswhenin' という名前が付けられています) には、UserControls バインド プロパティに渡すパック URI が含まれており、これも機能しますが、3 番目のイメージ (realImage) はまったく表示されません!

それが機能しない理由がわかりません。バインディングが適切であることはわかっていますし、マークアップ内の画像の配置も適切であることはわかっています。

どんな助けでも大歓迎です。前もって感謝します。

4

1 に答える 1

5

あなたのコードビハインドを見ることができないので、確かなことは言えませんが、私は問題が何であるかを知っていると確信しています.

Image.Source型のオブジェクトが必要ですImageSource。XAML で URL を指定すると、既定の WPF コンバーターを使用して URL がオブジェクトに変換されImageSourceます。バインディングを使用しているため、デフォルトのコンバーターは使用されません。そのため、画像ソースをオブジェクトではなく URL 値に設定しようとしている可能性がありImageSourceます。

コード ビハインド プロパティでは、ImageSourceオブジェクトを作成する必要がありますが、これは非常に面倒です。を作成BitmapImageして URL を渡すことができます。

最も簡単な解決策は、バインド先のコード ビハインド プロパティで Microsoft の既定のコンバーターを使用するか、バインディングで明示的に使用することです。コンバーターは と呼ばれImageSourceConverterます。

編集:

簡単な例を次に示します。

バインディング ソース内のコード:

public ImageSource AddImageSource
{
    get
    {
        ImageSourceConverter imgConv = new ImageSourceConverter();
        return imgConv.ConvertFrom(this.AddImage);
    }
}

AddImage プロパティではなく、このプロパティを対象とするようにバインディングを更新します。AddImage プロパティが変更された場合にも、このプロパティの PropertyChanged イベントを必ず発生させてください。

このためのテスト シナリオを作成するのに時間はかかりませんでしたが、問題なく動作するはずです。

于 2009-10-27T14:44:06.320 に答える