Задать вопрос
@StrangeCry

Как правильно извлечь из БД Uri для отображения картинки в DataGrid (C# WPF)?

Заполняю DataGrid из БД Sqlite. Все текстовые и числовые столбцы через биндинги заполняются правильно. Кроме столбца с картинками (там в БД ссылки на картинки в папке проекта):
<DataGridTemplateColumn Header="Icon">
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <Image Source="{Binding Path=EmblemPath}" Height="20"/>
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

Но если вставить напрямую текст из БД (Source="\Resources\Emblems\Teams\Liverpool.png"), то картинка отображается. То есть, ссылки работают, не работает именно биндинг.
Насколько я разобрался, то понял, что проблема в том, что Source ожидает Uri, а получает string. Поэтому добавил в код конвертер:
public class StringToUriConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return new Uri((string)value, UriKind.Relative);
    }
    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return DependencyProperty.UnsetValue;
    }
}

Проверяю его работу кнопкой:
private void TestButton_Click(object sender, RoutedEventArgs e)
{
    string a = Teams[3].EmblemPath.ToString();
    StringToUriConverter stringToUriConverter = new StringToUriConverter();
    var LoadedUri = (Uri)stringToUriConverter.Convert(a, typeof(BitmapImage), null, CultureInfo.CurrentCulture);
    MessageBox.Show(LoadedUri.ToString());
    TestImage2.Source = new BitmapImage(LoadedUri);
}

Конвертер работает - картинка подгружается к image.
Подключаю конвертер к image в XAML:
<Image Source="{Binding Path=EmblemPath, Converter={StaticResource stringToUriConverter}}" Height="20"/>

Никакого эффекта - картинки всё так же не отображаются.

Вопрос:
Что в моей логике неправильно? Или может есть какой-то другой более действенный способ подгрузить пути к картинкам из БД?
  • Вопрос задан
  • 20 просмотров
Подписаться 1 Средний Комментировать
Пригласить эксперта
Ответы на вопрос 1
VoidVolker
@VoidVolker Куратор тега C#
Dark side eye. А у нас печеньки! А у вас?
public System.Windows.Media.ImageSource Source { get; set; }

https://learn.microsoft.com/en-us/dotnet/api/syste...
Ну и у вас в коде же правильное решение:

TestImage2.Source = new BitmapImage(LoadedUri);

Т.е., вам надо конвертер не в Uri, а в тип BitmapImage. Ну или просто завести сразу свойство нужного типа.

Кроме того, вот тут у вас ошибка во втором параметре конвертера, который противоречит касту:
var LoadedUri = (Uri)stringToUriConverter.Convert(a, typeof(BitmapImage), null, CultureInfo.CurrentCulture);


Там должен быть тип в который происходит конвертация. Ну и вообще конвертер лучше реализовывать полностью со всеми проверками и типами.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы