我有一个通用的网格列表控件。这让我将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。
唯一的问题是-设置RowSpan时,它不会刷新后续的单元格。因为,在创建网格和所有单元之后,我将在运行时中应用RowSpan。如何刷新网格和其他剩余单元格以移至其自己的单元格?
谢谢您的帮助。
答案 0 :(得分:0)
设置网格列表的ItemsSource = null
,然后将其重新设置为所需的项目来源。
答案 1 :(得分:0)
问题原因:
正如您所说,设置RowSpan时不会刷新后续单元格。
解决方案:
使用Grid.SetRowSpan(this, 2);
设置行距后,必须再次绑定数据源。
答案 2 :(得分:0)
因为我有自己的“自定义网格列表”控件。我实现了更多的属性,这些属性使我知道何时必须在RowSpan中获取网格中的子视图并调整后续的子项。这是解决此问题的唯一最佳方法,而不是重新分配ItemSource属性。因为,如果我们分配物料来源,它将重新绘制所有物料(包括行和列-而不是行/列)。因此,我们仍然会遇到同样的问题。
解决方案:在我的网格控件中添加了RowSpan逻辑。