Путь к изображению сохраняется в базе данных, как получить с помощью Binding в Xamarin - PullRequest
0 голосов
/ 24 апреля 2020

Я использую дизайн MVVM и пытаюсь извлечь "изображение" из моей базы данных, используя привязку. «Фотография» сохраняется в базе данных как «photo.png».

Я создал локальную папку, которую приложение iPhone & Android может извлечь из локального ресурса.

Когда я жестко кодирую изображение, строка кода выглядит так:

<Image Source="{local:ImageResource GSUACM.ProfileImages.gsu_logo.png}" VerticalOptions="Center" HeightRequest="64" />

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

Моя привязка в моем файле XAML: <Image Source="{Binding someImage}"

. Пользователь создается сразу после входа в приложение. Первоначальный запрос извлекает имя, пароль, изображение и т. Д. c и сохраняет их как глобальную переменную.

В модели представления я создал get / set для "someImage"

public ImageSource someImage { get; set; }

Перед установкой привязки я связал «изображение» с «путем». Путь:

String pathName = "local:ImageResource GSUACM.ProfileImage."

И, кроме того, я установил someImage в глобальную переменную

this.someImage = pathName + GlobalVars.User.ProfileImage;

После распечатки someImage в консоли указан правильный путь, но он указан как URI.

Uri: local:ImageResource GSUACM.ProfileImage.rat.png

, и программа далее заявляет:

ImageLoaderSourceHandler: Image data was invalid: Xamarin.Forms.StreamImageSource

Я ошибаюсь, думая, что могу объединить строки, и это будет работать как путь?

1 Ответ

1 голос
/ 24 апреля 2020

Исходя из вашего кода и описания, я предполагаю, что ваше изображение Встроенные изображения , и оно будет размещено в общем проекте. Чтобы заставить его работать со связыванием, вам нужно использовать Преобразователи значений связывания :

Вот пример, который я использую:

public class EmbeddedToImageSourceConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value is string fileName && parameter is String assemblyName)
        {
            try
            {
                var imageSource = ImageSource.FromResource(assemblyName + "." + fileName, typeof(EmbeddedToImageSourceConverter).GetTypeInfo().Assembly);
                return imageSource;
            }
            catch (Exception)
            {
                return value;
            }
        }
        else
            return value;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return value;
    }
}

А в xaml вы можете установите привязку следующим образом:

<ContentPage.Resources>
    <local:EmbeddedToImageSourceConverter x:Key="converter"/>
</ContentPage.Resources>

<StackLayout>
    <!-- Place new controls here -->
    <Image Source="{Binding imageName, Converter={StaticResource converter}, ConverterParameter='App220'}"
       HorizontalOptions="Center"
       VerticalOptions="CenterAndExpand" />
</StackLayout>

Примечание: ConverterParameter здесь должен быть путь root вашего изображения. Например, здесь я установил App220, потому что я поместил его прямо в общий проект. Если я помещу изображение в папку с именем tempImageFolder, то ConverterParameter должно быть App220.tempImageFolder.

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

См. Как связать локальное встроенное изображение в ListView в формах Xamarin?

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