Silverlight中的动态图像源绑定

时间:2010-11-18 09:47:43

标签: c# wpf silverlight binding ivalueconverter

我想根据DataContext中的ChildWindow来设置图片的来源。这是XAML文件:

<controls:ChildWindow x:Class="CEM.Controls.DialogWindow"
           xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
           xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
           xmlns:controls="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls" Title="{Binding Title}">
  ...
  <Image x:Name="DialogIcon"></Image>
  ...
</controls:ChildWindow>

如果我覆盖Show的{​​{1}}方法并设置图片的来源,则工作正常:

ChildWindow

但它看起来很丑陋并且不是“银色方式”,所以我决定改变:

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

您看到我已注册<Image x:Name="DialogIcon" Source="{Binding DialogIconType, Converter={StaticResource DialogIconConverter}}"></Image> 来绑定来自DialogIconConverter的来源。

DataContext

但它现在不能正常工作,我在这个控件中有几个其他转换器工作正常。只有这一个不起作用。你能帮忙找出问题所在吗?

编辑: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的{​​{1}}属性。

DataContext

2 个答案:

答案 0 :(得分:2)

假设DialogIconType是图像的路径(例如“Images / DialogWindow / Confirm.png”),它应该没有值转换器,如下所示:

<Image Source="{Binding DialogIconType}" />

修改

也可以从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));
}

答案 1 :(得分:1)

可能很傻,但你确定你的转换器在你的xaml文件中被正确引用了吗?

否则,我建议尝试将此语法作为URI的路径(将图像设置为资源):

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

编辑:

好吧,我想我已经知道了: 看看你的输出窗口,你可能会看到一些错误40绑定... blablabla ...

我的猜测是转换器是正确的,但绑定的来源不是,所以基本上甚至没有使用转换器。

原因是您的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中,您应该绑定到“IconType”,而不是“DialogIconType”(这是一种类型,而不是属性)

(这可能是唯一的问题,因为我不确定这里是否真的需要依赖属性,现在我想到了它)