0

コンテンツがイメージであるボタンで構成される小さなユーザー コントロールを作成しました。ボタン内のイメージからユーザー コントロールにバインドするために、ユーザー コントロールに "ImageSource" 依存関係プロパティを作成しました。

ただし、ユーザー コントロール設定のインスタンスを配置した XAML では、実行時にプロパティがエラーをスローします。

<ctrl:ImageButton ImageSource="/Resources/Images/Icons/x.png" Command="{Binding Reset}"  DisabledOpacity="0.1"/>

そして実行時:

「/Resources/Images/Icons/x.png」文字列は、タイプ「ImageSource」の「ImageSource」プロパティの有効な値ではありません。「ImageSource」タイプには、パブリック TypeConverter クラスがありません。

次に、コンバーターを作成しました。

public class StringToBitmapImage : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return new BitmapImage(new Uri((string) value, UriKind.RelativeOrAbsolute));
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

そして、依存関係プロパティをそれで装飾しました:

    [TypeConverter(typeof(StringToBitmapImage))]
    public static readonly DependencyProperty ImageSourceProperty = DependencyProperty.Register(
        LambdaHelper.GetMemberName<ImageButton>(ib => ib.ImageSource), typeof (ImageSource), typeof (ImageButton));
    [TypeConverter(typeof(StringToBitmapImage))]
    public ImageButton ImageSource
    {
        get { return (ImageButton)GetValue(ImageSourceProperty); }
        set { SetValue(ImageSourceProperty, value); }
    }

それでもWPFは私の文字列をImageSource(BitmapImage)インスタンスに変換しません...

何をすべきか?

4

1 に答える 1

1

ここにはいくつかの誤りがあります:

まず、CLR プロパティは を返しますがImageButton、依存関係プロパティは として定義されていImageSourceます。

第 2 に、型コンバーターはバインディング値コンバーターと同じではありません。型コンバーターは、プロパティ自体ではなくTypeConverter、クラスから派生して適用する必要があります。ImageSource

3 番目に、フレームワークの型には型コンバーターとしてwithImageSourceが既にあるため、カスタム コンバーターを作成しなくても、すべてがすぐに機能するはずです。別の名前空間で別のカスタム クラスを参照していないことを確認してください。TypeConverterAttributeImageSourceConverterImageSource

最後にImageBrush.ImageSource.AddOwner、まったく新しい依存関係プロパティを再定義するのではなく、使用します。

編集: Berrylのコメントに答えるには:

public static readonly DependencyProperty ImageSourceProperty = ImageBrush.ImageSource.AddOwner(typeof(ImageButton);

このコードは、新しい所有者とオプションで新しいメタデータを定義するだけで、新しい ImageSource プロパティを定義するのではなく (それぞれの依存関係プロパティがグローバル静的辞書に登録されることに注意してください)、既存の ImageSource プロパティを再利用します。まるでOverrideMetadata外の授業のようです。

于 2010-06-23T17:38:44.327 に答える