Xamarin: привязка к свойству ImageSource не работает

#xamarin #binding #imagesource

#xamarin #привязка #imagesource

Вопрос:

Я пытаюсь динамически отображать изображения с помощью привязки:

У меня есть наблюдаемая коллекция TabItem, в которую я загружаю png в свойство Icon:

 TabItems.Add(new TabItem()
{
    Title = AppResources.Home,
    IsSelected = true,
    Icon = ImageSource.FromResource("Home.png")
});
  

Где:

 public class TabItem : BindableObject
{
    private bool _isSelected;

    public ImageSource Icon { get; set; }

    public string Title { get; set; }

    public bool IsSelected
    {
        get
        {
            return _isSelected;
        }
        set
        {
            if (_isSelected != value)
            {
                _isSelected = value;
                OnPropertyChanged();
            }
        }
    }
}
  

И у меня есть DataTemplate TabItem в CollectionView, который отображает эти элементы и использует свойство Icon для привязки к изображению:

      <DataTemplate x:DataType="local:TabItem" x:Key="TabItem_DataTemplate">
        <StackLayout Orientation="Vertical" HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand"
                     WidthRequest="{Binding Title, Converter={StaticResource ProportionateConverter}}"
                     >
            <Image Source="{Binding Icon}" InputTransparent="True" HeightRequest="50" />
            <Label HorizontalOptions="Center" VerticalOptions="End" FontSize="Small"
                   Text="{Binding Title}"
                   InputTransparent="True" 
                   TextColor="{Binding IsSelected, Converter={StaticResource IsSelectedToTextColorConverter}}"/>
        </StackLayout>
    </DataTemplate>
  

Я получаю сообщение об ошибке во время выполнения:

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

Изображения находятся в папке Resources и помечены как встроенный ресурс

Обновленное решение: (Спасибо Джейсону)

Решением было использование моего расширения разметки при инициализации свойства Icon (я буду рад услышать о более элегантном способе)

 var homeExt = new ImageResourceExtension()
{
    Source = "TimeManager.Resources.Icons.Home.png"
};

TabItems.Add(new TabItem()
{
    Title = AppResources.Home,
    IsSelected = true,
    Icon = (ImageSource)(homeExt.ProvideValue(null))
});
  

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

1. измените значок на строку, содержащую имя ресурса

2. Когда я это делаю, я получаю: FileImageSourceHandler: не удалось найти изображение или файл изображения недействителен: File: Home.png

3. если вы жестко Source="Home.png" закодируете свой XAML, это работает? Если нет, то есть проблема с вашими изображениями, которую вам нужно исправить в первую очередь

4. Нет, здесь та же ошибка. Но когда я использую свое расширение разметки, оно работает: Resources.Home.png}»

5. если ваше изображение в ресурсах общего проекта? Если это так, то вам придется объединить привязку имени ресурса в виде строки с вашим расширением