Silverlight中的动态图像源绑定
我想根据DataContext
在ChildWindow
中设置图像的源。这里是XAML文件:Silverlight中的动态图像源绑定
<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>
它的正常工作,如果我重写ChildWindow
的Show
方法和设置图像的源:
public new void Show()
{
DialogIcon.Source = new BitmapImage(new Uri(@"/Images/DialogWindow/Confirm.png", UriKind.Relative));
base.Show();
}
但它看起来丑陋,这不是“Silverlight的方式” ,所以我决定改变:
<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
的一个实例将被分配给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;
}
可能是愚蠢的,但是你要确保你的转换器在您的XAML文件正确引用?
否则,我建议尝试这种语法为您的URI路径(含图片设置为资源):
return new BitmapImage(new Uri("pack://application:,,,/Images/DialogWindow/Confirm.png", UriKind.Relative));
编辑:
好吧,我想我已经得到了它: 看看你的输出窗口,你可能会看到一些错误40绑定... blablabla ...
我的猜测是转换器是正确的,但绑定的来源不是,所以基本上转换器是n甚至没有用过。
原因是你的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”(其是一种类型而不是属性)
(这可能是唯一的问题,因为我不确定是否真的需要在这里实现dependencyProperty,现在我想起来了)
它在'App.xaml'中被正确引用,其他一些转换器在那里。 – 2010-11-18 12:07:56
@丹尼:我编辑了一些关于我的问题的反思问题 – David 2010-11-18 13:41:48
这是一个错字!我需要将'DialogIconType'更改为'IconType'!谢谢! – 2010-11-18 14:13:24
假设DialogIconType
是路径到您的图像(例如 “图像/ DialogWindow/Confirm.png”),它不经valueconverter工作,如下所示:
<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));
}
@Jakob:看我的编辑。 – 2010-11-18 10:07:51
@Danny Chen:...看到我的编辑:-) – 2010-11-18 10:22:39
@Jakob:不工作。因为'Image'的'Source'属性是'ImageSource'类型,而不是'string'类型。我们可以将XAML中的字符串值赋给'Source'属性,因为它将被转换为'ImageSource',因为'Image'类中有一个名为'SourceProperty'的'DependencyProperty'。但是如果你实现你自己的'Converter',你必须返回确切的类型。 – 2010-11-18 10:31:15
...并查看我的编辑:-) – 2010-11-18 10:23:16
您是否尝试使用“Images/DialogWindow/Confirm.png”而不是“/Images/DialogWindow/Confirm.png”? – 2010-11-18 10:40:57
@Jakob:试过了,没有工作。 – 2010-11-18 10:44:44