3

我想根据它DataContext在 a中设置图像的来源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方法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将分配给 的DataContext属性DialogWindow

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;
}
4

2 回答 2

2

可能很傻,但是您是否确保在您的 xaml 文件中正确引用了您的转换器?

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

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

编辑 :

好的,我想我明白了:查看您的输出窗口,您可能会看到一些错误 40 binding ... 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”(这是一种类型而不是属性)

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

于 2010-11-18T10:54:00.487 回答
2

假设这DialogIconType是您的图像的路径(例如“Images/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));
}
于 2010-11-18T10:01:11.567 回答