Xamarin表格网格条件RowSpan

时间:2018-11-19 19:31:48

标签: xamarin.forms

我有一个通用的网格列表控件。这让我将Item Source和ItemTemplate绑定在一起,它将根据项目数或根据用户如何设置行和列来生成列和行。直到这里都是完美的。它支持我需要的所有泛型。

现在问题部分: 我有一个ContentView,它将用作网格的项目模板。该模板将用于多种数据类型。我能够正确地做到这一点。现在,我有一个数据类型,如果第一个单元格满足特定条件,则第一个单元格应具有RowSpan:以下代码可以正常工作。它完美地创建了RowSpan。

    bool isYearBuilt = false;
    bool isAny = false;

    public FilterItemView()
    {
        InitializeComponent();
    }

    protected override void OnBindingContextChanged()
    {
        base.OnBindingContextChanged();

        var context = BindingContext as PropertyFilterItem;
        if (context == null)
            return;

        if(context.FilterType==PropertyFilterTypes.YearBuilt)
        {
            if(context.IsAny)
            {
                isYearBuilt = true; isAny = true;   
            }
        }
    }


    protected override void OnParentSet()
    {
        base.OnParentSet();
        GridList grid = this.Parent as GridList;
        if (grid == null)
            return;

        if(isYearBuilt && isAny)
        {
            Grid.SetRowSpan(this, 2);
        }
    }

这些是图片;这将更完美地描述它: 根据上面的代码,它就是这样。我们可以看到它正在创建RowSpan。 This is how it looks based on above code. We can see that it is creating RowSpan.

This is how it should look at the end 这就是我所期望的。

唯一的问题是-设置RowSpan时,它不会刷新后续的单元格。因为,在创建网格和所有单元之后,我将在运行时中应用RowSpan。如何刷新网格和其他剩余单元格以移至其自己的单元格?

谢谢您的帮助。

3 个答案:

答案 0 :(得分:0)

设置网格列表的ItemsSource = null,然后将其重新设置为所需的项目来源。

答案 1 :(得分:0)

问题原因:

正如您所说,设置RowSpan时不会刷新后续单元格。

解决方案:

使用Grid.SetRowSpan(this, 2);设置行距后,必须再次绑定数据源。

答案 2 :(得分:0)

因为我有自己的“自定义网格列表”控件。我实现了更多的属性,这些属性使我知道何时必须在RowSpan中获取网格中的子视图并调整后续的子项。这是解决此问题的唯一最佳方法,而不是重新分配ItemSource属性。因为,如果我们分配物料来源,它将重新绘制所有物料(包括行和列-而不是行/列)。因此,我们仍然会遇到同样的问题。

解决方案:在我的网格控件中添加了RowSpan逻辑。