Страницы

Поиск по вопросам

воскресенье, 29 марта 2020 г.

BitmapImage не работает с Binding?

#c_sharp #wpf


Интересная ситуация, при попытке установки значения для BitmapImage.UriSource через
привязку данных, вот так:



    
        
            
                
                
                
            

            
                
                    
                        
                    
                
            

            
                
            

            
                
            

        
    




После инициализации View происходит исключение: 


  InvalidOperationException: Необходимо задать свойство "UriSource" или
  "StreamSource".


Т.е. в момент инициализации DataContext еще не установлен, но это произойдет немного
позже. Как с этим бороться т.к. игнорируется значение TargetNullValue а так же FallbackValue?
    


Ответы

Ответ 1



Смотрите (c). TargetNullValue предназначен для случаев, когда привязка работает, но источник содержит значение null, у вас же, пока DataContext не установлен, привязка оказывается в нерабочем состоянии, но для BitmapImage это недопустимо, он обязательно должен иметь установленное свойство UriSource или StreamSource. Для случаев, когда привязка сломана или источник содержит недопустимое значение предназначена именно фича FallbackValue, т. е. вроде бы ваш пример должен заработать если написать так: Но он не заработает как нам нужно: заглушка для картинки появится, но когда мы установим DataContext, она не поменяется на нужную нам. Тут есть еще одна загвоздка (читайте комментарии в статье про BitmapImage на MSDN): ... После инициализации изменения свойств игнорируются. т. е. созданное единожды BitmapImage навсегда останется таким. Тут у вас есть несколько вариантов: написать простой конвертер, который будет по строке (или Uri) создавать новый экземпляр BitmapImage: class UriToBitmapImageConverter : ConverterBase { public override object Convert(object value, Type targetType, object parameter, CultureInfo culture) { var b = new BitmapImage { CacheOption = BitmapCacheOption.OnDemand, CreateOptions = BitmapCreateOptions.DelayCreation }; b.BeginInit(); b.UriSource = new Uri((string)value); b.EndInit(); return b; } } и воспользоваться им: воспользоваться фичей PriorityBinding: затем: но здесь, конечно, BitmapImage создается автоматически с настройками по умолчанию. В обоих вариантах получаем:

Комментариев нет:

Отправить комментарий