xamarin формирует список, рисует ячейки, но они пусты - PullRequest
0 голосов
/ 08 января 2019

В списке отображается правильное количество идей в базе данных, но на ярлыке не отображаются названия идей, как в wfa.

Метка в моей таблице данных связана с переменной имени идеи. По какой-то причине, кажется, что название этих идей не написано на этикетке видоискателя.

Я знаю, что это не проблема с моим SQL-кодом, так как он прекрасно работает в wfa.

Шаги, которые я использовал, чтобы найти решение моей проблемы: 1. исследовал список, как он работает и как его использовать 2. Я потратил 4 часа, пытаясь связать ярлык несколькими способами 3. метка не будет привязана к моим переменным даже вне списка. 4. Я искал решение на Google, переходя на 2 страницы для каждого поискового запроса.

вот код, от которого зависит список идей:

Список идей

<ListView x:Name="Ideas" SeparatorColor="Accent" SeparatorVisibility="Default" ItemsSource="{Binding idea}" >
        <ListView.ItemTemplate>
            <DataTemplate>
                <ViewCell>
                    <Frame BackgroundColor="Bisque" Padding="2" Margin="0,1,0,1">
                        <Label Text="{Binding idea.idea}" VerticalTextAlignment="Center"  FontSize="Small"  HorizontalOptions="FillAndExpand"></Label>
                    </Frame>
                </ViewCell>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>

Класс Mainpage (упрощенный, чтобы показывать только код, используемый списком)

Class Mainpage {
public static bool ShowHiddenIdeas = false;

ListView ideaso;

public static List<Idea> ideas;

public MainPage() {
    GetIdeas(0); //get all ideas from the first table in the database 
    InitializeComponent();
}

void GetIdeas(int id) {
ideas = Kaiosql.GetIdeaSQL(id); //reads from the database and compiles a list of ideas in the table

/* 
tried using a list of strings instead of the idea class
List<string> ideasz = new List<string>();
    foreach (Idea i in ideas)
    {
        ideasz.Add(i.idea);
    } 
It just does the same thing
*/

ideaso.ItemsSource = ideas;
}
}

Идея класса

public class Idea
{
    public int ID;
    public string idea;
    public string Description;
    public string Type;
    public string Time;
    public bool HasFolder;
    public string FolderPath;
    public bool IsStarted;
    public bool IsComplete;
    public bool IsUploaded;

    public Idea(int iD, string idea, string description, string type, string time, bool hasFolder = false, string folderPath = null, bool isStarted = false, bool isComplete = false, bool isUploaded = false)
    {
        ID = iD;
        this.idea = idea;
        Description = description;
        Type = type;
        Time = time;
        HasFolder = hasFolder;
        FolderPath = folderPath;
        IsStarted = isStarted;
        IsComplete = isComplete;
        IsUploaded = isUploaded;
    }
}

Класс имеет больше информации, чем моя идеабаза в настоящее время может вывести. Я надеюсь, что это не причина, по которой данные не отображаются.

Большое спасибо! - Зак Кайокен

Ответы [ 2 ]

0 голосов
/ 08 января 2019

Для работы нужно сделать несколько изменений.

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

public class Idea
{
    public int ID {get; set;}
    public string idea {get; set;}
    public string Description {get; set;}
    public string Type {get; set;}
    public string Time {get; set;}
    public bool HasFolder {get; set;}
    public string FolderPath {get; set;}
    public bool IsStarted {get; set;}
    public bool IsComplete {get; set;}
    public bool IsUploaded {get; set;}

    public Idea(int iD, string idea, string description, string type, string time, bool hasFolder = false, string folderPath = null, bool isStarted = false, bool isComplete = false, bool isUploaded = false)
    {
        ID = iD;
        this.idea = idea;
        Description = description;
        Type = type;
        Time = time;
        HasFolder = hasFolder;
        FolderPath = folderPath;
        IsStarted = isStarted;
        IsComplete = isComplete;
        IsUploaded = isUploaded;
    }
}

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

Второе: это может быть опечатка, поскольку она точно не будет работать так.

изменение:

ideaso.ItemsSource = ideas;

для

Ideas.ItemsSource = ideas;

Будучи идеями, x: Name присвоило ListView в XAML.

Третье: изменить порядок вызовов в конструкторе.

public MainPage()
{
    InitializeComponent();
    GetIdeas(0); //get all ideas from the first table in the database 
}

Метод GetIdeas попытается получить доступ к ListView, и этот экземпляр создается при вызове метода InitializeComponent. Вот почему обязательно вызывать этот метод перед попыткой доступа к любому элементу UIE в XAML.

Четыре:

XAML должен выглядеть так:

<ListView x:Name="Ideas" SeparatorColor="Accent" SeparatorVisibility="Default">
    <ListView.ItemTemplate>
        <DataTemplate>
            <ViewCell>
                <Frame BackgroundColor="Bisque" Padding="2" Margin="0,1,0,1">
                    <Label Text="{Binding idea}" VerticalTextAlignment="Center"  FontSize="Small"  HorizontalOptions="FillAndExpand"></Label>
                </Frame>
            </ViewCell>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

Удалите лишние «идеи» в текстовой привязке и удалите ItemSource , так как вы уже устанавливаете это свойство в коде позади.

С этими изменениями вы должны увидеть список с вашим ideas.

Существуют и другие изменения, которые вы можете сделать, чтобы сделать свой код немного более понятным MVVM, вы можете прочитать об этом подробнее здесь

Надеюсь, это поможет .-

0 голосов
/ 08 января 2019

У тебя слишком много идей. Вот как должен выглядеть ваш xaml

EDIT

Попробуйте эту ссылку

<ListView x:Name="Ideas" SeparatorColor="Accent" SeparatorVisibility="Default" ItemsSource="{Binding idea}" >
        <ListView.ItemTemplate>
            <DataTemplate>
                <ViewCell>
                    <Frame BackgroundColor="Bisque" Padding="2" Margin="0,1,0,1">
                        <Label Text="{Binding idea}" VerticalTextAlignment="Center"  FontSize="Small"  HorizontalOptions="FillAndExpand"></Label>
                    </Frame>
                </ViewCell>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
...