Привязка изображений в виде списка в xamarin

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

Товар добавлен правильно, но изображение не отображается.

здесь cs.

ObservableCollection<Libreria> items = new ObservableCollection<Libreria>(new Libreria().GetLibrerie());

            public Home()
            {
                InitializeComponent ();



                lstLibrerie.ItemsSource = items;
                //pickerLibrerie.ItemsSource = new Libreria().GetLibrerie();


            }

            public void Reload(Libreria newLib)
            {

                items.Insert(0, newLib);

            }

здесь xaml

 <ListView x:Name="lstLibrerie" RowHeight="120">
                <ListView.ItemTemplate>
                    <DataTemplate>
                        <ViewCell>
                            <ScrollView> <!-- left, top, right, bottom -->
                                <StackLayout Margin="0,20,0,0" Orientation="Horizontal">
                                    <Grid HorizontalOptions="FillAndExpand">
                                        <Grid.ColumnDefinitions>
                                            <ColumnDefinition Width="2*" />
                                            <ColumnDefinition Width="8*" />
                                        </Grid.ColumnDefinitions>
                                        <Grid.RowDefinitions>
                                            <RowDefinition Height="*" />
                                            <RowDefinition Height="*" />
                                            <RowDefinition Height="*"/>
                                        </Grid.RowDefinitions>
                                        <Image Margin="20,0,0,0" Source="{Binding Icona}" Grid.Column="0" Grid.Row="0" Grid.RowSpan="3" Aspect="AspectFit" HeightRequest="120"></Image>
                                        <Label Text="{Binding Label}" Grid.Column="1" Grid.Row="0" FontAttributes="Bold"   />
                                        <Label Text="{Binding DataUltimaApertura}" Grid.Column="1" Grid.Row="1"   />
                                        <Label Text="{Binding EtichettaNrOggetti}"  Grid.Column="1" Grid.Row="2"  />
                                        <BoxView HeightRequest="1" Grid.Row="3" Grid.ColumnSpan="2" Grid.Column="0" HorizontalOptions="FillAndExpand" VerticalOptions="EndAndExpand" Color="Black" />
                                    </Grid>
                                </StackLayout>
                            </ScrollView>
                        </ViewCell>
                    </DataTemplate>
                </ListView.ItemTemplate>
            </ListView>

Может мне помочь? заранее спасибо


person luna80    schedule 26.03.2019    source источник
comment
Попробуйте установить для HasUnevenRows значение true в представлении списка и отключить rowheight. Я обнаружил с помощью ListView, что он не будет изменять размер или перерисовывать, когда есть изменения, которые могут привести к изменению списка или ячеек, если эти свойства не установлены.   -  person Max Hampton    schedule 26.03.2019
comment
спасибо max hamptom но проблема все еще осталась.   -  person luna80    schedule 26.03.2019
comment
Какой тип собственности Icona в Libreria?   -  person Max Hampton    schedule 26.03.2019
comment
поле Icona представляет собой строку   -  person luna80    schedule 26.03.2019
comment
У вас есть прокрутка в viewcell? Это интересный подход. Вы пытались удалить это и просто иметь макет стека?   -  person Skin    schedule 27.03.2019
comment
Удалить режим прокрутки из ячейки просмотра   -  person G.Mich    schedule 27.03.2019
comment
Icona - это строка URL-адреса изображения или имя локального изображения?   -  person Jack Hua    schedule 27.03.2019
comment
@skin и g. mich я удалил scrollview из viewcell, и теперь это только макет стека, но проблема все еще остается.   -  person luna80    schedule 27.03.2019
comment
@jack hua: Icona - это строка с локальным именем.   -  person luna80    schedule 27.03.2019
comment
@ luna80 что если вы удалите привязку к изображению и жестко закодируете имя изображения в XAML?   -  person Skin    schedule 27.03.2019
comment
@ luna80 Вы пробовали мое решение ниже? Любая проблема?   -  person Jack Hua    schedule 27.03.2019
comment
всем, кто мне помогает, если я прокручу список после добавления элемента (немного, чтобы скрыть), появится изображение ..   -  person luna80    schedule 27.03.2019


Ответы (2)


Я использую ваш код, чтобы написать простую демонстрацию для обновления изображений в listView, добавлять элемент каждые 2 секунды:

Код на главной странице:

public partial class MainPage : ContentPage
{
    ObservableCollection<Libreria> items = new ObservableCollection<Libreria>();

    int a = 0;

    public MainPage()
    {
        InitializeComponent();

        items.Add(new Libreria("1", "Images"));

        lstLibrerie.ItemsSource = items;
        //pickerLibrerie.ItemsSource = new Libreria().GetLibrerie();          

        Device.StartTimer(TimeSpan.FromSeconds(2), () =>
        {
            if (a == 0)
            {
                Reload(new Libreria("2", "Images"));
                a = 1;
            }else if (a == 1)
            {
                Reload(new Libreria("3", "Images1"));
                a = 2;
            }
            else if(a == 2)
            {
                Reload(new Libreria("4", "Images2"));
                a = 0;
            }

            return true;
        });
    }

    public void Reload(Libreria newLib)
    {

        items.Insert(0, newLib);

    }
}

public class Libreria  : INotifyPropertyChanged
{
    string myLabel;

    public string Label
    {
        set
        {
            if (myLabel != value)
            {
                myLabel = value;

                if (PropertyChanged != null)
                {
                    PropertyChanged(this, new PropertyChangedEventArgs("Label"));
                }
            }
        }
        get
        {
            return myLabel;
        }
    }

    string icon;

    public string Icona
    {
        set
        {
            if (icon != value)
            {
                icon = value;

                if (PropertyChanged != null)
                {
                    PropertyChanged(this, new PropertyChangedEventArgs("Icona"));
                }
            }
        }
        get
        {
            return icon;
        }
    }

    public Libreria(string label, string cona) {

        Label = label;
        Icona = cona;        
    }

    public event PropertyChangedEventHandler PropertyChanged;
}

Я удалил ScrollView из ViewCell, а другой код xaml такой же, как и вы.

Посмотрим на результат:

обновить изображение

Ответьте мне, если у вас есть вопросы.

person Jack Hua    schedule 27.03.2019
comment
Большое спасибо @jack hua, ваш пример работает, но не мой список, я не могу понять, что мне не хватает - person luna80; 27.03.2019
comment
@ luna80 Хорошо, ваша модель унаследована от INotifyPropertyChanged? Ярлык обновился при добавлении товара? Также вы можете добавить свой код Libreria к своему вопросу, и я проверю его для вас. - person Jack Hua; 27.03.2019
comment
является моделью, унаследованной от INotifyPropertyChanged. Метка добавлена ​​правильно, но не изображение. теперь я приложу скриншот, чтобы лучше объяснить мне и код Libreria - person luna80; 27.03.2019
comment
Что ж, я пока не могу воспроизвести вашу проблему. Можете ли вы попробовать разные изображения в своем Drawable? - person Jack Hua; 27.03.2019
comment
Да, я пробовал другое изображение, но с таким же поведением - person luna80; 27.03.2019
comment
@ luna80 Какую версию Xamarin.forms вы используете? Я использую 3.4.0.1008975. Вы можете попробовать другую версию. - person Jack Hua; 27.03.2019
comment
Я использую 3.6.0.264807. Я могу попробовать другой. Странно еще и то, что если я запускаю UWP, все работает - person luna80; 27.03.2019
comment
Я попробовал вашу версию @jack hua, но проблема осталась. в ios я пока не могу попробовать - person luna80; 27.03.2019
comment
@ luna80 Вы ее решили? Мне интересно узнать причину. - person Jack Hua; 28.03.2019
comment
спасибо @jack hua, нет, у меня все еще есть проблема, и я не знаю, что делать ... кажется, это так легко решить, но это не так. Вы настолько любезны, что я спрашиваю вас, возможно, придется использовать INotifyCollectionChanged или INotifyPropertyChanged. Что вы думаете? - person luna80; 28.03.2019
comment
@ luna80 Нет необходимости изменять INotifyPropertyChanged. Можете ли вы создать новый проект с простейшим кодом для воспроизведения проблемы, а затем загрузить его на Github. Тогда я смогу скачать и проверить. - person Jack Hua; 28.03.2019
comment
хуа конечно, я могу это сделать! Я ценю вашу помощь, спасибо! Я напишу сюда ссылку после того, как выложу образец проекта на githubt. - person luna80; 28.03.2019
comment
@ luna80 Конечно, я проверю, как только вы напишете ссылку. - person Jack Hua; 28.03.2019
comment
хуа у меня хорошие новости, я решил! Проблема заключалась в асинхронном методе. Копия изображения не была завершена. Вызов метода копирования с помощью await сделал свое дело. В любом случае большое спасибо за вашу помощь! - person luna80; 28.03.2019
comment
@ luna80 Рад это слышать :). - person Jack Hua; 28.03.2019

вот скриншот

public class Libreria : INotifyPropertyChanged
{
    [PrimaryKey]
    public Guid Id { get; set; }
    public Tipo Tipo { get; set; }
    public int IdTipo { get; set; }
    public int NrOggetti { get; set; }

    public string DataUltimaApertura { get; set; }
    string _label;
    string _icon;


    public Libreria()
    {
    }

    public string Label
    {
        set
        {
            if (_label != value)
            {
                _label = value;

                if (PropertyChanged != null)
                {
                    PropertyChanged(this, new PropertyChangedEventArgs("Label"));
                }
            }
        }
        get
        {
            return _label;
        }
    }


    public string Icona
    {
        set
        {
            if (_icon != value)
            {
                _icon = value;

                if (PropertyChanged != null)
                {
                    PropertyChanged(this, new PropertyChangedEventArgs("Icona"));
                }
            }
        }
        get
        {
            return _icon;
        }
    }

    public string EtichettaNrOggetti
    {
        get
        {
            return string.Format("Nr. elementi: {0}", NrOggetti);
        }
    }


public List<Libreria> GetLibrerie()
    {
        string query = string.Format("SELECT COUNT(oggetto.idlibreria) AS NrOggetti, Label, IdTipo, DataUltimaApertura, Icona FROM libreria LEFT JOIN oggetto ON libreria.id = oggetto.idlibreria GROUP BY libreria.id ORDER BY dataultimaapertura DESC");

        return App.DBConnection.Query<Libreria>(query);
        // return App.DBConnection.Table<Libreria>().OrderByDescending(lib => lib.Dataultimaapertura).ToList();
    }

    public Guid Insert()
    {
        this.Id = Guid.NewGuid();
        string query = string.Format("INSERT INTO libreria(id, idtipo, label, dataultimaapertura, icona) VALUES('" + this.Id + "'," + this.IdTipo + ",'" + this.Label + "', '" + this.DataUltimaApertura + "', '" + this.Icona + "')");

        App.DBConnection.Execute(query);

        return this.Id;

    }

    public event PropertyChangedEventHandler PropertyChanged;
}
person luna80    schedule 27.03.2019