【问题标题】:I need to put my table data into ListView (MVVM)我需要将表数据放入 ListView (MVVM)
【发布时间】:2019-07-19 13:26:04
【问题描述】:

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

<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 文件。我在这里为 in 绑定创建每个属性。带有支持字段。

在我的视图模型中

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);
}

【问题讨论】:

  • 您有什么理由回滚我的更改吗?我认为我没有改变任何改变问题的东西。编辑以提高可读性是Stack Overflow 工作方式的重要组成部分。
  • 对不起,我是堆栈溢出的新手。我不知道如何将这些更改添加到我的问题中。我看到了您的更改,但我不知道如何应用它
  • 我明白了。如果用户足够受信任(声誉 >= 2000),则会立即应用编辑。在这种情况下,您无需采取任何措施(但您仍然可以选择回滚更改,就像您所做的那样)。如果某个用户的声誉较低,则该编辑必须经过其他用户的审核和批准。
  • 谢谢。如果用户编辑了我的问题,如果用户的声誉超过 2000,它会自动更新,这意味着我不明白这一点。是这种情况

标签: c# sqlite mvvm xamarin.forms


【解决方案1】:

在我看来,您的 add 方法实际上并没有添加任何东西。在您的视图模型中,您需要有一个公共属性YourList,它通过add 传播。此外,您只能从费用数据库中获取一项,这不适用于添加 10 项。

据我所知,核心问题是

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

忽略我不知道您如何以及何时致电add这一事实,我将尝试给出有关如何获取和添加这些元素的答案。

首先,我们需要一个将您的项目保存在您的视图模型中的属性。根据您的要求,IEnumerable&lt;AddExpenses&gt;ObservableCollection&lt;AddExpenses&gt; 都可以。我将演示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()

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-12
    • 1970-01-01
    • 2011-04-16
    • 2017-04-14
    • 2018-05-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多