Silverlight中的动态图像源绑定

问题描述:

我想根据DataContextChildWindow中设置图像的源。这里是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> 

它的正常工作,如果我重写ChildWindowShow方法和设置图像的源:

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的一个实例将被分配给DialogWindowDataContext属性。

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; 
} 
+0

...并查看我的编辑:-) – 2010-11-18 10:23:16

+0

您是否尝试使用“Images/DialogWindow/Confirm.png”而不是“/Images/DialogWindow/Confirm.png”? – 2010-11-18 10:40:57

+0

@Jakob:试过了,没有工作。 – 2010-11-18 10:44:44

可能是愚蠢的,但是你要确保你的转换器在您的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,现在我想起来了)

+0

它在'App.xaml'中被正确引用,其他一些转换器在那里。 – 2010-11-18 12:07:56

+0

@丹尼:我编辑了一些关于我的问题的反思问题 – David 2010-11-18 13:41:48

+0

这是一个错字!我需要将'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)); 
} 
+0

@Jakob:看我的编辑。 – 2010-11-18 10:07:51

+0

@Danny Chen:...看到我的编辑:-) – 2010-11-18 10:22:39

+0

@Jakob:不工作。因为'Image'的'Source'属性是'ImageSource'类型,而不是'string'类型。我们可以将XAML中的字符串值赋给'Source'属性,因为它将被转换为'ImageSource',因为'Image'类中有一个名为'SourceProperty'的'DependencyProperty'。但是如果你实现你自己的'Converter',你必须返回确切的类型。 – 2010-11-18 10:31:15