当使用带有 TFDMemTable 的 LiveBindingsDesigner 时,带有 TImageObjectAppearance 的 TListView DynamicAppearance 将不会查看图像

TListView DynamicAppearance with TImageObjectAppearance will not view image when using LiveBindingsDesigner with TFDMemTable

我欢迎 Embarcaderos 为使 TListView 更加动态化所做的努力,并且很高兴看到 Sarina Duponts post here 在那里你可以 link LiveBindings 中 TListView 属性的图像索引使用 DynamicAppearance 和 TImageObjectAppearance 时,Designer,甚至图像 属性 到数据字段(整数)。

但是...我试过了,几乎成功了。

在我的挑战中,我有一个应用程序,我在其中使用带有 TREST* 函数的 TFDMemTable 来填充 TFDMemTable。如果我不使用 DynamicAppearance 并使用 ImageListItem 和 links 我想使用 LiveBindings Designer 中的图像索引 属性 的数据字段,一切都很好。

尽管使用 DynamicApperance,没有图像索引 属性 到 link,但是 Sarina Dupont 在这里 post 说你可以 link 整数字段直接到图片 属性(IDE/compiler 会弄清楚)。

好吧...我想出了以下结论:我的数据字段(从 TREST* 和 TFDMemTable 半创建)并不一定是它们看起来的样子。由于我使用的是 REST/JSON,字段类型是 "anonymized" 到 WideString,实际上 FieldDefs->'dataitem'->DataType 设置为 "ftWideString"。我试图将此值更改为 ftInteger,希望这会有所帮助,但我确实收到了此错误消息:"FDMemtTable1: Type mismatch in field for 'datafield', exepecting: WideString actual: Integer"。

所以...我快到了,我真的很想使用 DynamicAppearance 并为每个 TListViewItem 查看多个图像和文本字段...

...或者动态创建 ListViewItem 'Template' 并用数据填充它更容易,最好的方法是什么?

我通常尽量避免使用 LiveBindings。最快、最稳定和最简单的方法是使用代码添加项目。

    ListView1->BeginUpdate();

try {
    for (int i = 0; i <   arrayOfThings->item.Length; i++) {
        TListViewItem* item = ListView1->Items->Add();

        item->Text = arrayOfThings->item[i]->item_name;
        item->Data["itemName"]  = TValue::From<UnicodeString>( arrayOfThings->item[i]->item_name);
        item->Data["itemId"]        = TValue::From<UnicodeString>( IntToStr( arrayOfThings->item[i]->id ));
        item->Data["itemDate"]      = TValue::From<UnicodeString>(arrayOfThings->item[i]->item_date);
// adding the image - imgClock is name of the image field [TImageObjectAppearance ] added to items in ItemAppearance in the TListView object that uses DynamicAppereance
        const UnicodeString imgClock = L"imgClock";
        dynamic_cast<TListItemImage*>(item->Objects->FindDrawable(imgClock))->Bitmap = //bitmap source;
    }
} catch (...) {

}
ListView1->EndUpdate();