Xamarin Forms - 重绘视图

Xamarin Forms - Redraw view

我正在使用 Xamarin Forms 编写应用程序 XAML,我需要一种重绘视图的方法。

我有一个包含多个标签和一个 ListView 的布局。我还有一个按钮,当按下时调用 API 来下载一组需要更新页面上的控件的新数据。

我的所有控件都已正确绑定,因此当数据在后台更新时,数据会在视图上更新,但不会重绘控件,因此会弄乱布局的外观。

有时我的 ListView 中的数据可能只有 1 或 2 行,但通常会更多。第一次绘制页面时,一切看起来都很好,但我的问题是在使用 ListView 中具有不同行数的数据更新视图时,因为控件不会调整大小。

示例:

第一次进入屏幕时,我下载了数据,ListView 有 10 个项目,因此在屏幕上绘制了 10 行

当我按下 "Reload Data" 按钮时,下载的数据现在可能只包含 2 个项目。数据已正确更新,但屏幕上的间距仍然与第一次绘制时的大小相同(有 10 个项目),所以我现在有一个大空白 space。

如果与此示例相反(第一个条目是 2 项,第二个条目是 10 项),则 ListView 的 space 仍然只有 2 项高,因此您只能看到 2共 10 项。

我想要做的是在下载新数据时以某种方式刷新控件,以便重新绘制 ListView 的大小,并且始终是显示的项目数量的正确大小。

有同样的问题。我认为你是错误的。 ListView 并不像您想象的那样工作。它的设计并非总是完全适合其内容。如果你想要那个,你需要自己计算高度并将其设置为ListView

一种方法是更改​​ ListView 的高度。您可以通过将 属性 绑定到 HeightRequest:

来实现
<ListView
  HeightRequest="{Binding ListViewHeight}">
</ListView>

这是我对 ListViewHeight 的计算。 RowHeight 对于 Android 是 72,对于 iOS 是 75。这是一个肮脏的解决方案,因为高度的硬编码值,但它是我找到的解决问题的最佳解决方案。请记住,您需要调整这些值以满足您的需要,否则您的 ListView 可能太 small/tall.

public double ListViewHeight
{
    get
    {
        if (MyItemsList!= null)
        {
            double listViewHeight = MyItemsList.Count * RowHeight;
            if (CanLoadMoreNotifications)
            {
                listViewHeight += RowHeight;
            }
            return listViewHeight;
        }
        return 0;
    }
}

现在,每次您对列表进行更改时,请致电 RaisePropertyChanged("ListViewHeight");。这样,您的 ListView 身高就会计算出来,您的 UI 就会更新。