Динамическая привязка источника изображения в silverlight - PullRequest
2 голосов
/ 18 ноября 2010

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

Ответы [ 2 ]

2 голосов
/ 18 ноября 2010

Предполагая, что DialogIconType - это путь к вашему изображению (например, «Images / DialogWindow / Confirm.png»), он должен работать без преобразователя значений, как показано ниже:

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

EDIT:

Также возможен возврат пути к изображению из метода 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));
}
1 голос
/ 18 ноября 2010

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

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

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

РЕДАКТИРОВАТЬ:

хорошо, я думаю, что понял: загляните в свое окно вывода, вы, вероятно, увидите какую-то привязку ошибки 40 ... 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" (который является типом, а не свойством)

(это может быть даже единственная проблема, так как я не уверен, действительно ли здесь нужен объект dependencyProperty, теперь, когда я об этом думаю)

...