Привязка элемента изображения к свойству в uwp

У меня есть элемент изображения в xaml, и я хочу связать его со свойством в моей модели представления. У меня есть привязка элемента xaml Image к свойству MainImage, как показано ниже.

private Image mainImage_ = new Image();
    public Image MainImage
    {
        get
        {
            return mainImage_;
        }
        set
        {
            if (mainImage_ != value)
            {
                mainImage_ = value;
                OnPropertyChanged("MainImage");
            }                                        
        }
    }

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

FileOpenPicker openPicker = new FileOpenPicker();
        openPicker.SuggestedStartLocation = PickerLocationId.PicturesLibrary;
        openPicker.ViewMode = PickerViewMode.Thumbnail;
        openPicker.FileTypeFilter.Clear();
        openPicker.FileTypeFilter.Add(".bmp");
        openPicker.FileTypeFilter.Add(".png");
        openPicker.FileTypeFilter.Add(".jpeg");
        openPicker.FileTypeFilter.Add(".jpg");
        StorageFile file = await openPicker.PickSingleFileAsync();
        if (file != null)
        {
            IRandomAccessStream fileStream = await file.OpenAsync(FileAccessMode.Read);
            BitmapImage bitmapImage = new BitmapImage();
            bitmapImage.SetSource(fileStream);
            MainImage = bitmapImage;                    
            new MainPage().DataContext = file;                             
        }

MainImage = bitmapImage показывает ошибку, которую мы не можем установить напрямую. Как я могу решить эту проблему? Должен ли возвращаемый тип свойства быть строкой (путем) или изображением? Если есть другой лучший способ сделать, дайте мне знать, пожалуйста.


person Umair Jameel    schedule 16.12.2015    source источник


Ответы (2)


Ваше свойство модели представления должно иметь тип ImageSource, а не Image:

private ImageSource mainImage;
public ImageSource MainImage
{
    get { return mainImage; }
    set
    {
        if (mainImage != value)
        {
            mainImage = value;
            OnPropertyChanged("MainImage");
        }                                        
    }
}

Теперь вы можете привязать свойство Source элемента управления Image в XAML к вашей модели представления следующим образом:

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

Однако для этого требуется, чтобы DataContext вашей страницы был установлен на экземпляр вашей модели представления, например. подобно

DataContext = new ViewModel();

Вы не должны устанавливать его на что-то другое позже, как вы, кажется, делаете в строке

new MainPage().DataContext = file;

Кроме того, непонятно, почему вы создаете новый экземпляр MainPage в этой строке.

person Clemens    schedule 17.12.2015
comment
Большое спасибо, это сработало. однако я установил контекст данных непосредственно в xaml. - person Umair Jameel; 17.12.2015

Вам нужно установить исходное свойство изображения для вашего растрового изображения. Пытаться:

            bitmapImage.UriSource = new Uri(img.BaseUri,file.Name);
            MainImage.Source = bitmapImage;

РЕДАКТИРОВАТЬ: извините, я не видел UWP, попробуйте это.

person Casey Price    schedule 16.12.2015
comment
Выдает исключение NullReferenceException. - person Umair Jameel; 16.12.2015
comment
Вы уверены, что MainImage инициализируется? - person Casey Price; 16.12.2015
comment
Приведенный выше код — это все, что я написал для этой цели. - person Umair Jameel; 16.12.2015