我需要将表数据放入ListView(MVVM)

时间:2019-02-26 03:37:40

标签: c# sqlite mvvm xamarin.forms

数据库连接和绑定上下文都可以。数据可以毫无问题地插入表中。我需要将表数据行的最后一个添加到列表视图

<ListView ItemsSource="{Binding YourList}" 
          verticalOptions="FillAndExpand" >
    <ListView.ItemTemplate>
        <DataTemplate>
            <ViewCell>
                <StackLayout Orientation="Horizontal">
                    <Label Text="{Binding Catagoryview}"/>
                    <Label Text="{Binding Date}"/>
                    <Label Text="{Binding Expense}"/>

                </StackLayout>
            </ViewCell>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

这是我的XAML文件。我在这里创建用于绑定的每个属性。带有后备字段。

在我的ViewModel中

private void add()
{
    database = new Database();
    var expensedata = database.GetExpenses(id);

    if (expensedata != null)
    {
        Catagoryview = expensedata.Catagory;
        Date= expensedata.Date;
        Expense = expensedata.Expense; 
    }
}

我知道这段代码并不完美。我真的需要将数据的最后10行放入列表视图。

另外,这里是我使用的取款方式

public AddExpenses GetExpenses(int expense)
{
    return Conn.Table<AddExpenses>().FirstOrDefault(t => t.Id == expense);
}

1 个答案:

答案 0 :(得分:0)

对我来说,似乎您的add方法实际上并未添加任何内容。在您的视图模型中,您将需要有一个公共属性YourList,该属性随add一起传播。此外,您从费用数据库中仅获得一项,而添加10项无效。

据我了解,核心问题是

  

如何使用MVVM方法将SQLite数据库中的最后10个项目添加到Xamarin.Forms ListView中。

不管我不知道如何以及何时致电add,我都会尝试给出有关如何获取和添加这些元素的答案。

首先,我们需要一个可将您的项目保存在视图模型中的属性。根据您的要求,可以使用IEnumerable<AddExpenses>ObservableCollection<AddExpenses>。我将演示ObservableCollection方法

ObservableCollection<AddExpenses> _expenses;

public ObservableCollection<AddExpenses> Expenses
{
    get
    {
        if(_expenses == null)
        {
            _expenses = new ObserrvableCollection<AddExpenses>();
        }
        return _expenses;
    }
}

您可以从XAML绑定到该属性

<ListView ItemsSource="{Binding Expenses}" 
      VerticalOptions="FillAndExpand">
<!-- What ever -->
</ListView>

然后从您的AddExpenses方法向该集合中添加项目(我可以随意给它起一个更有意义的名称):

private void AddExpenses()
{
    var database = new Database();
    var expenses = database.GetLastExpenses(numberOfExpenses: 10);

    foreach(var expense in expenses)
    {
        Expenses.Add(expense);
    }
}

由于您的集合中现在有类型为AddExpenses的对象,所以我们必须将ListView中的绑定从Categoryview更改为Category

<ListView ItemsSource="{Binding YourList}" 
          VerticalOptions="FillAndExpand">
    <ListView.ItemTemplate>
        <DataTemplate>
            <ViewCell>
                <StackLayout Orientation="Horizontal">
                    <Label Text="{Binding Category}"/>
                    <Label Text="{Binding Date}"/>
                    <Label Text="{Binding Expense}"/>
                </StackLayout>
            </ViewCell>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

最后但并非最不重要的一点是,我们必须实现GetLastExpenses(这应该可以工作,虽然可能有更好的选择)

public AddExpenses[] GetLastExpenses(int numberOfExpenses)
{
    return Conn.Table<AddExpenses>()
               .OrderByDescending(expenses => expenses.Date) 
               .Take(numberOfExpenses)
               .OrderBy(expenses => expenses.Date) // If you need them ordered ascending
               .ToArray()

}