FireMonkey中如何调用data-aware(live-binding)组件的刷新?

How to call the refreshing of data-aware (live-binding) component in FireMonkey?

我有一个 TListView 在 LiveBindings 中与 TFDMemTable 链接。我使用 LoadFromFile 在 FDMemTable 中加载数据(例如,我有 20 条记录)。

当我从FDMemTable中删除一条记录时,RecordCount减少了,但TListView没有刷新,它继续显示LoadFormFile上加载的20条记录。

如果使用 FDMemTable:我 .SaveToFile.Close 并使用 .LoadFromFile 重新加载,TListView 现在会显示更改。

无论是否使用 FDMemTable 的 CachedUpdate,这都是相同的行为。

我已经尝试调用 TFDMemTable.RefreshTListView.Repaint 但没有成功。

是否可以调用 TListView 来刷新他的 "linked" 数据集?

当我删除 FDMemTable 中的一条记录时,为什么 TListView 上没有出现可见的刷新?

编辑: 我必须添加一件事,以编程方式删除记录。

所需的功能是删除 FDMemTable 中不需要的记录,并使用 TListView 向用户显示剩余记录。

这里的实时绑定并不是始终双向的。 ListView 实时绑定旨在从 UI 到数据集方向工作,但仅在大多数情况下。

如果您启用 CanSwipeDelete,如果您知道如何操作,您可以预期它会起作用。

就我而言,在 Android,我发现自己正在编写代码以确保列表视图与数据集保持同步,即使实时绑定处于活动状态。在我的例子中是一个名为 CDSAnimals 的 TClientDataset,具有唯一键值 TagID。希望对您有所帮助。

procedure TfrmLiveMain.ListView1DeletingItem(Sender: TObject; AIndex: Integer;
  var ACanDelete: Boolean);
var
  LI: TListViewItem;
  LIO: TListItemText;
begin

  // check that the livebindings is doing it's job, if not
  // do it myself
  ACanDelete := False;
  LI := ListView1.Items[AIndex];
  LIO := LI.Objects.FindObjectT<TListItemText>('Text1');
  FTagID := LIO.Text;
  if ClientModule2.CDSAnimals.FieldByName('TagID').AsString <> FTagID then
    ClientModule2.CDSAnimals.Locate('TagID', FTagID, []);
  if ClientModule2.CDSAnimals.FieldByName('TagID').AsString = FTagID then
  begin
    ACanDelete := True; // causes the listview item to be deleted without
                        // affecting the corresponding dataset record
  end;

end;

procedure TfrmLiveMain.ListView1DeleteItem(Sender: TObject; AIndex: Integer);
begin

  // this is called with the wrong index!
  if ClientModule2.CDSAnimals.Locate('TagID', FTagID, []) then
    if ClientModule2.CDSAnimals.FieldByName('TagID').AsString = FTagID then
      begin
        // now delete the corresponding record too
        ClientModule2.CDSAnimals.Delete; // and it works!
      end;

end;

在 LiveBindings Designer 中,通过 link 将 ListViewSynch 转换为 FDMemTable*ListView现在显示结果记录。

同样在我的最后一个算法中,因为我使用 .BeginBatch / .EndBatch(禁用数据感知刷新),在处理数据以删除不需要的记录时我必须暂时禁用 LiveBinding link(原因我在处理数据时使用不同的排序索引):LinkListControlToField1.Active := false; 和 "re-link" 处理后:LinkListControlToField1.Active := true;