3


0

silverlightの動的画像ソースバインディング

「ChildWindow」の「DataContext」に従って画像のソースを設定したい。 XAMLファイルは次のとおりです。

  ...

  ...

ChildWindow`の Show`メソッドをオーバーライドし、画像のソースを設定すると、問題なく動作します。

public new void Show()
{
    DialogIcon.Source = new BitmapImage(new Uri(@"/Images/DialogWindow/Confirm.png", UriKind.Relative));
    base.Show();
}

しかし、それは見苦しく、「銀色の方法」ではないため、変更することにしました。


DataContext`からソースをバインドするために登録された DialogIconConverter`があります。

public class DialogIconConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
       //currently it's an hard-coded path
       return new BitmapImage(new Uri(@"/Images/DialogWindow/Confirm.png", UriKind.Relative));
    }
    ...
 }

しかし、現在は機能していません。このコントロールには、正常に機能している他のコンバーターがいくつかあります。 これだけが機能していません。 問題がどこにあるか見つけるのを手伝ってもらえますか?

編集:「DialogIconType」は列挙型であり、「DialogContext」のプロパティでもあります。 DialogContext`のインスタンスは、 DialogWindow`の `DataContext`プロパティに割り当てられます。

public enum DialogIconType
{
    Confirm,
    Alert,
    Error
}
public class DialogContext
{
    public string Title { get; set; }
    public string Content { get; set; }
    public DialogButtons Buttons { get; set; }
    public DialogIconType IconType { get; set; }
}
internal DialogWindow(DialogContext context)
{
    InitializeComponent();
    this.DataContext = context;
}

2 Answer


3


`DialogIconType`が画像へのパスであると仮定します(例: 「Images / DialogWindow / Confirm.png」)、以下に示すように、valueconverterがなくても動作するはずです。


編集:

valueconverterの `Convert`メソッドから画像へのパスを返すことも可能です-すなわち:

public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
    return "Images/DialogWindow/Confirm.png";
}

編集2:

次は `UriKind.Relative`を使用しても動作します:

public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
    return new BitmapImage(new Uri("Images/DialogWindow/Confirm.png", UriKind.Relative));
}


2


ばかげているかもしれませんが、xamlファイルでコンバーターが適切に参照されていることを確認しましたか?

そうでない場合は、URIのパスとしてこの構文を試すことをお勧めします(リソースとして画像をセットアップします)。

return new BitmapImage(new Uri("pack://application:,,,/Images/DialogWindow/Confirm.png", UriKind.Relative));

編集:

OK かくかくしかじか…​

私の推測では、コンバーターは正しいが、バインディングのソースは正しくないので、基本的にコンバーターは使用されません。

理由は、DialogIconTypeは依存関係プロパティではないため、バインドできないためです。

言い換えれば、これ:

public DialogIconType IconType { get; set; }

これになるはずです:

public static DependencyProperty IconTypeProperty = DependencyProperty.Register("IconType", typeof(DialogIconType), typeof(DialogContext));
public DialogIconType IconType
{
    get { return (DialogIconType)(GetValue(IconTypeProperty)); }
    set { SetValue(IconTypeProperty , value); }
}

さらに、Xamlでは、「DialogIconType」(タイプでありプロパティではない)ではなく、「IconType」にバインドする必要があります

(dependencyPropertyが実際にここで本当に必要かどうかわからないので、これが唯一の問題かもしれませんが、今私はそれを考えています)