Решение для привязки ошибок, выбрасываемых путем установки Image.Source для привязки к нулю. (Подавление?) - PullRequest
0 голосов
/ 15 февраля 2011

У меня есть сценарий, в котором для источников изображений установлено значение null, которые разрешаются позже и затем отображаются.Любой хороший способ запретить моему коду выдавать ошибки привязки?

Пример:

System.Windows.Data Ошибка: 23: Невозможно преобразовать '' из типа '' в тип 'System.Windows.Media.ImageSource 'для культуры "en-US" с преобразованиями по умолчанию;рассмотрите возможность использования свойства Converter Binding.NotSupportedException: 'System.NotSupportedException: ImageSourceConverter не может преобразовать из (ноль).в System.ComponentModel.TypeConverter.GetConvertFromException (значение объекта) в System.Windows.Media.ImageSourceConverter.ConvertFrom (контекст ITypeDescriptorContext, культура CultureInfo, значение объекта) в MS.Internal.Data.DefaultValueConverter.ConnectDefenceOelpeTepeperText (targetElement, CultureInfo culture, Boolean isForward) '

XAML

<Image x:Name="image" Height="Auto" Width="Auto" Opacity="0">
    <Image.Effect>
        <DropShadowEffect/>
    </Image.Effect>
    <Image.Source>
        <Binding Path="ImageStream">
            <Binding.ValidationRules>
                <validationRules:NotNullStreamValidationRule/>
            </Binding.ValidationRules>
        </Binding>
    </Image.Source>
</Image>

C #

namespace FlickrDemo.ViewModel
{
    public class FlickrPhotoViewModel : ViewModelBase
    {
        public const string ImageStreamPropertyName = "ImageStream";

        private Stream _imageStream = null;

        public Stream ImageStream
        {
            get
            {
                return _imageStream;
            }

            set
            {
                if (_imageStream == value)
                {
                    return;
                }
                _imageStream = value;

                RaisePropertyChanged(ImageStreamPropertyName);
            }
        }

        public const string IsLoadingPropertyName = "IsLoading";

        private bool _isLoading = false;

        public bool IsLoading
        {
            get
            {
                return _isLoading;
            }

            set
            {
                if (_isLoading == value)
                {
                    return;
                }

                _isLoading = value;

                RaisePropertyChanged(IsLoadingPropertyName);
            }
        }

        public const string PhotoIDPropertyName = "PhotoID";

        private string _photoID = String.Empty;

        public string PhotoID
        {
            get
            {
                return _photoID;
            }

            set
            {
                if (_photoID == value)
                {
                    return;
                }

                var oldValue = _photoID;
                _photoID = value;

                RaisePropertyChanged(PhotoIDPropertyName);
            }
        }

        public FlickrPhotoViewModel(string photoID)
        {
            this.PropertyChanged += async (s, e) =>
            {
                if (e.PropertyName == ImageStreamPropertyName)
                {
                    if (!(ImageStream == null || ImageStream == Stream.Null))
                    {
                        IsLoading = false;
                    }
                }
            };
            IsLoading = true;
            PhotoID = photoID;
        }
    }
}

Ответы [ 3 ]

2 голосов
/ 05 декабря 2012

Я столкнулся с той же проблемой, пытаясь использовать строковый URI (а не поток). Я решил проблему, установив свойство в моей модели представления типа ImageSource, которая является типом свойства Source в Image, и связав Source с этим свойством. Это получает любое автоматическое преобразование из микса. В новом свойстве обработайте нулевой регистр, затем перейдите к стандартному ImageSourceConverter. В вашем случае, я думаю, это будет выглядеть примерно так:

Код:

public const string ImageStreamPropertyName = "ImageStream";

private Stream _imageStream = null;

public Stream ImageStream
{
    get
    {
        return _imageStream;
    }

    set
    {
        if (_imageStream == value)
        {
            return;
        }
        _imageStream = value;

        RaisePropertyChanged(ImageStreamPropertyName);
        // Raise for ImageSource too since it changes with ImageStream
        RaisePropertyChanged("ImageSource");
    }
}

public ImageSource ImageSource
{
    get
    {
        if (ImageStream == null)
            return null;

        return (ImageSource)new ImageSourceConverter().ConvertFrom(ImageStream);
    }
}

XAML:

    <Image.Source>
        <Binding Path="ImageSource" />
    </Image.Source>
1 голос
/ 15 февраля 2011

Проблема в типе данных ImageStream свойства.Не существует преобразователя, который знает, как обрабатывать нулевую ситуацию:

System.Windows.Data Ошибка: 23: Невозможно преобразовать '' из типа '' в тип 'System.Windows.Media.ImageSourceдля «en-US» культуры с конверсиями по умолчанию; рассмотрите возможность использования свойства Converter Binding

Одна из возможностей решения этой проблемы - создать собственную реализацию IValueConverter .Если входное значение является потоком, верните его.Если нет, верните ноль.Если это не сработает, верните пустой макет ImageSource.

Что-то вроде:

public class ImageStreamForwardConverter : IValueConverter{
    public object Convert(object value, Type targetType, object parameter, CultureInfo    culture){
      if(null == value){
         return null;
      }else if(value is Stream){
         return value;
      }else{
         throw new InvalidOperationException("Unsupported type");
      }
      ....
0 голосов
/ 25 апреля 2016

Ответ Пата по приведенной ниже ссылке работал отлично для меня, он включает простой преобразователь значений, который вместо этого возвращает DependencyProperty.UnsetValue в случае нулевого значения.

Ошибка ImageSourceConverter для Source = null

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...