Привязка исходного изображения WPF с помощью StringFormat - PullRequest
2 голосов
/ 07 августа 2010

Я новичок в WPF и MVVM (начал на этой неделе экспериментировать с ним) и пытаюсь связать ресурсы изображений во время выполнения.Элементы, которые я пытаюсь отобразить, содержат свойство enumerate, которое указывает тип или состояние элемента:

public class TraceEvent
{
    /// <summary>
    /// Gets or sets the type of the event.
    /// </summary>
    /// <value>The type of the event.</value>
    public TraceEventType EventType { get; set; }
}

Насколько мне известно, атрибут Source для Image имеет конвертер значений, который принимает строки и возвращаетUri объекты.

<Image Source="{Binding Path=EventType, StringFormat={}/AssemblyName;component/Images/{0}Icon.ico}" />

Так почему же не работает выше?Если я вхожу в URI напрямую (без привязки) изображение отображается отлично.Фактически, если я сделаю привязку в TextBlock и использую результат этого значения в изображении, также показанном без проблем:

<TextBlock Visibility="Collapsed" Name="bindingFix" Text="{Binding Path=EventType, StringFormat={}/AssemblyName;component/Images/{0}Icon.ico}"/>
<Image Source="{Binding ElementName=bindingFix, Path=Text}" />  

Я почти уверен, что делаю что-то ужасное неправильно для такогоочевидная вещь, чтобы сделать с изображениями.

Спасибо.

Ответы [ 2 ]

6 голосов
/ 10 декабря 2010

StringFormat используется только в том случае, если целевое свойство фактически является строкой - свойство Image.Source является Uri, поэтому механизм привязки не будет применять StringFormat.

Одна альтернатива - использовать Конвертер значений .Либо напишите общий StringFormatConverter, который принимает строковый формат в ConverterParameter, либо более конкретный ImageSourceConverter, например

public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
    return string.Format( "/Images/{0}Icon.ico", value );
}

Обратите внимание, что если ваши изображения находятся в той же сборке, что и используемые, вам не нужночтобы указать имя сборки в URI, и приведенный выше синтаксис должен работать.

0 голосов
/ 02 сентября 2010

Я не уверен насчёт этого, но кажется, что вы передаете свойству source исходную строку, где оно ожидает URI. Итак, вы должны преобразовать вашу строку в объект URI

...