2015-07-07 6 views
1

Я кодировал приложение метрополии 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 синхронизирует свойство ItemIndexTListBox, но не реальный id выбранной записи. Есть ли правильный выход для решения проблемы?

enter image description here

ответ

0

Я пытался использовать живые привязки, но обнаружил, что в тот момент, вы отойти от тривиального в реальный мир, что обручи вы должны прыгать через, чтобы заставить его работать, не стоит усилий. Это, к примеру, случай. В то время как вы делаете «то, о чем они думали» (1 запись = 1 запись), все в порядке, но как только вы уйдете от этого, вы больше не сможете использовать быстрые привязки и должны начать создавать свои собственные настраиваемые классы привязки, которые нуждаются в гораздо более глубоком понимании живых привязок, чем Быстрые привязки, и, на мой взгляд, разыгрывает объект упражнения.

Итак, если вы не хотите придерживаться простого способа делать что-то, я не думаю, что есть простой ответ.

В моем случае я использовал XE2. Я не знаю, что происходит в XE5.

+0

Спасибо, @Dsm. Конечно, я решил проблему, используя ручную настройку курсора DataSet в событии ListBox1Change без LiveBindings. Но мне было интересно, как это сделать, используя стандартный родной LiveBinding, который говорит «современные» технологии. Раньше таких проблем не было. Вы можете просто использовать надежные средства управления данными. Вопрос о том, как решить проблему в «обновленном», по-прежнему открыт. Я хотел сказать, что трудно поверить, что вы не можете использовать такой общий компонент, как «TListBox», используя стандартные быстро развивающиеся методы IDE. –