2010-11-18 3 views
2

Я хочу установить источник изображения в соответствии с его 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> 

Это работает отлично, если я переопределить Show метод ChildWindow и установить источник сигнала изображения в:

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)); 
    } 
    ... 
} 

Но он не работает сейчас, у меня есть несколько других преобразователей в этом управлении, которые работают нормально. Только этот не работает. Можете ли вы найти, где проблема?

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

... и см. мое редактирование :-) –

+0

Вы пытались использовать «Images/DialogWindow/Confirm.png» вместо «/Images/DialogWindow/Confirm.png»? –

+0

@Jakob: Пробовал, не работает. –

ответ

1

может быть глупо, но вы убедитесь, что ваш конвертер правильно ссылаться в файле XAML?

иначе, я предлагаю попробовать этот синтаксис пути для вашего URI (с настройкой изображения в качестве ресурсов):

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

EDIT:

нормально, я думаю, что у меня есть это: загляните в свое окно вывода, вы, вероятно, увидите некоторую ошибку 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', некоторые другие конвертеры там с ним. –

+0

@ Danny: Я отредактировал с некоторым отражением, которое у меня было относительно проблемы – David

+0

Это опечатка! Мне нужно изменить 'DialogIconType' на' IconType'! Благодаря! –

2

Предполагая, что DialogIconType путь к изображению (например, "Images/DialogWindow/Confirm.png"), он должен работать без ValueConverter, как показано ниже:

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

EDIT:

Возвращение путь к изображению из Convert метода ValueConverter является также возможно - то есть:

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

EDIT 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: Смотрите мое редактирование. –

+0

@ Danny Chen: ... и посмотреть мое редактирование :-) –

+0

@Jakob: Не работает. Поскольку свойство 'Source'' Image 'является типом 'ImageSource', а не' string'. Мы можем назначить строковое значение в XAML для свойства 'Source', потому что оно будет преобразовано в' ImageSource', поскольку в классе 'Image' есть' DependencyProperty' с именем 'SourceProperty'. Но если вы реализуете свой собственный «Конвертер», вы должны вернуть точный тип. –