2016-06-18 4 views
0

У меня есть исключение синтаксиса XAML «BitmapImage UriSource должен быть установлен». Во время разбора мой конвертер создается, но метод Convert() не вызывается. Что я делаю не так?C# Wpf Custom Converter создан, но не вызван

XAML:

<ImageBrush > 
    <ImageBrush.ImageSource> 
      <BitmapImage UriSource="{Binding Path=Value.Image, Converter={StaticResource imageConverter}, ConverterParameter=Value.Image}" CacheOption="OnLoad"></BitmapImage> 
    </ImageBrush.ImageSource> 
</ImageBrush> 

C#:

public class ImageConverter : IValueConverter 
{ 
    public ImageConverter() 
    { 
    } 
    public object Convert(object value, Type targetType, 
         object parameter, CultureInfo culture) 
    { 
     try 
     { 
      return new BitmapImage(new Uri((string)value)); 
     } 
     catch 
     { 
      return new BitmapImage(); 
     } 
    } 

    public object ConvertBack(object value, Type targetType, 
           object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 
+0

Если вы явно не установить 'Source 'или' RelativeSource' для Binding, вам нужно будет установить свойство DataContext элемента управления, содержащего ImageBrush (или один из его родительских элементов управления), в экземпляр класса с свойством 'Value'. Вы должны увидеть сообщение об ошибке привязки в окне вывода в Visual Studio. – Clemens

ответ

0

Я нашел своего рода решение. Так как мне нужно использовать <BitmapImage> только для установки CacheOption.OnLoad поэтому мой местный исходный файл не будет заблокирован, я создал пользовательский ImageConverter:

[ValueConversion(typeof(Uri), typeof(BitmapImage))] 
public class ImageConverter : IValueConverter 
{ 
    public ImageConverter() 
    { 
    } 
    public object Convert(object value, Type targetType, 
         object parameter, CultureInfo culture) 
    { 
     try 
     { 
      if(value == null) 
      { 
       return null; 
      } 
      var image = new BitmapImage(); 
      image.BeginInit(); 
      image.UriSource = value is Uri ? (Uri)value : new Uri(value.ToString()); 
      image.CacheOption = BitmapCacheOption.OnLoad; 
      image.EndInit(); 
      return image;    
     } 
     catch 
     { 
      return null; 
     } 
    } 

    public object ConvertBack(object value, Type targetType, 
           object parameter, CultureInfo culture) 
    { 
     throw new NotSupportedException("Convert back function is not supported"); 
    } 
} 

И XAML:

<ImageBrush ImageSource="{Binding Path=Value.Image, Converter={StaticResource imageConverter}}"> 
</ImageBrush>