Я кодировал приложение метрополии FMX в Delphi XE5 и встретил ошибку в синхронизации источника данных и TListBox. Он работает правильно, пока не появится заголовок группы, который объединяет один или несколько элементов. Выбор первого элемента в ListBox
(ListItemStyle
= MetropolisUI
) в группе приводит к его исчезновению из списка (он становится невидимым, это не влияет на сам набор данных).Связывание источника данных с TListBox с заголовками LiveBindings не работает
object LinkListControlToField1: TLinkListControlToField
Category = 'Quick Bindings'
DataSource = BindSourceDB1
FieldName = 'name2'
Control = ListBox1
FillExpressions = <
item
SourceMemberName = 'photo_mini'
ControlMemberName = 'Icon'
end
item
SourceMemberName = 'diagnosis_short'
ControlMemberName = 'Description'
end
item
ControlMemberName = 'Title'
CustomFormat = 'self.owner.name1.text+" "+self.owner.name2.text'
end>
ListItemStyle = 'MetropolisUI'
AutoBufferCount = False
FillHeaderExpressions = <>
FillBreakFieldName = 'ward'
FillHeaderCustomFormat = '"Ward "+ward.text'
FillBreakGroups = <>
end
end
Следующая упрощенный проект, который я использовал для воспроизведения ошибки действует иначе, но вопрос о проблеме почти то же самое. Нам нужны только форма с PrototypeBindSource1: TPrototypeBindSource;
(генерирующей буквенными и целыми полями), BindingsList1: TBindingsList; ListBox1: TListBox;
и Edit1: TEdit;
Вот ссылка LiveBindings:
object BindingsList1: TBindingsList
Methods = <>
OutputConverters = <>
Left = 20
Top = 5
object LinkListControlToField1: TLinkListControlToField
Category = 'Quick Bindings'
DataSource = PrototypeBindSource1
FieldName = 'ContactName1'
Control = ListBox1
FillExpressions = <>
AutoBufferCount = False
FillHeaderExpressions = <>
FillHeaderFieldName = 'UIntField1'
FillBreakGroups = <>
end
object LinkControlToField1: TLinkControlToField
Category = 'Quick Bindings'
DataSource = PrototypeBindSource1
FieldName = 'ContactName1'
Control = Edit1
Track = False
end
Выбор элементов не соответствует идентификатору выбранной записи в DataSource (DataSet) , Кажется, что движок LiveBindings синхронизирует свойство ItemIndex
TListBox
, но не реальный id
выбранной записи. Есть ли правильный выход для решения проблемы?
Спасибо, @Dsm. Конечно, я решил проблему, используя ручную настройку курсора DataSet в событии ListBox1Change без LiveBindings. Но мне было интересно, как это сделать, используя стандартный родной LiveBinding, который говорит «современные» технологии. Раньше таких проблем не было. Вы можете просто использовать надежные средства управления данными. Вопрос о том, как решить проблему в «обновленном», по-прежнему открыт. Я хотел сказать, что трудно поверить, что вы не можете использовать такой общий компонент, как «TListBox», используя стандартные быстро развивающиеся методы IDE. –