Question

I want to set an image's source according to its DataContext in a ChildWindow. Here is the XAML file:

<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>

It's working fine if I override the Show method of the ChildWindow and set the image's source:

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

But it looks ugly and it's not the "silverlight way", so I decide to change:

<Image x:Name="DialogIcon" Source="{Binding DialogIconType, Converter={StaticResource DialogIconConverter}}"></Image>

You see I have a DialogIconConverter registered to bind the source from the 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));
    }
    ...
 }

But it's not working now, I have several other converters in this control which are working fine. Only this one is not working. Can you help to find where the problem is?

EDIT: DialogIconType is an enum, and also it's a property of DialogContext. An instance of DialogContext will be assigned to DataContext property of the 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;
}
Was it helpful?

Solution

might be silly, but did you make sure that your converter is referenced properly in your xaml file ?

otherwise, I suggest trying this syntax as path for your URI (with images setup as resources):

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

EDIT :

ok, I think I've got it : look into your output window, you will probably see some error 40 binding ... blablabla...

My guess is that the converter is right, but the source of the binding isn't, so basically the converter is not even used.

The reason is that your DialogIconType is not a dependency property, so it cannot be bound to.

in other words, this :

public DialogIconType IconType { get; set; }

should become this :

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

plus, in your Xaml, you should Bind to "IconType", and not "DialogIconType" (which is a type and not a property)

(this might even be the sole issue, as I'm not sure if a dependencyProperty Is actually realy needed here, now that I think of it)

OTHER TIPS

Assuming that DialogIconType is the path to your image (e.g. "Images/DialogWindow/Confirm.png"), it should work without a valueconverter as shown below:

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

EDIT:

Returning the path to the image from the valueconverter's Convert method is also possible - i.e.:

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

EDIT 2:

The following also works using 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));
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top