Как отобразить в каждом ListBoxItem текстовые блоки с привязкой к файловым полям разных таблиц
-
08-07-2019 - |
Вопрос
Приветствую всех и прошу прощения за мой английский!У меня есть поле списка, это ItemsSource = myClientsList.Просмотр по умолчанию.Элементы ListBox имеют шаблон (ControlTemplate), который определен в a в отдельном файле ресурсов.Каждый элемент содержит небольшой текстовый блок, текстовое свойство каждого из которых имеет привязку к полям моего объекта myClientsList.
Мне нужно добавить в шаблон this item больше текстовых блоков, и каждый из них должен иметь привязку к полям другого моего класса myOrdersList.- (Итак, я хочу просмотреть в каждой строке ListBox информацию из разных таблиц моей базы данных - это вопрос).
Проблема в том, что у ItemsSource этого ListBox есть ссылка на объект myClientsList, и я не могу установить myOrderList в ItemSource того же ListBox.Итак, я должен найти способ указать TextBlock.DataContext, который находится внутри ControlTemplate или как можно решить эту проблему другим способом?
p.s.Я новичок в .Net и WPF и, вероятно, в моем объяснении есть ошибки - извините за это.
Решение
Похоже, у вас есть тип отображения DataGrid и вы хотите добавить больше столбцов, чтобы отобразить информацию о заказе для данного клиента.Если это так, то вам придется сделать пару вещей.Во-первых, вам нужно будет создать составной объект, который хранит информацию для обеих сущностей в одном объекте (таким образом, каждая строка вашего элемента управления содержит все данные, необходимые для отображения).Во-вторых, я бы рекомендовал использовать фактический элемент управления DataGrid для отображения строк вместо шаблона ListBoxItem .ListView со встроенным в фреймворк GridView не очень хорош, поэтому я бы рекомендовал Сетка данных WPFToolkit для бесплатного варианта.
Другие советы
Здесь есть две проблемы, если я правильно понял вопрос:как создать единую коллекцию, содержащую как Клиентов, так и Заказы, и как отображать Клиентов и Заказы по-разному в одном и том же списке?
Что касается первого, вы можете сделать это с помощью CompositeCollection .
Что касается второго, определите две DataTemplates вместо ControlTemplate .В качестве ключа каждой DataTemplate используйте тип объекта, который он собирается представить, например
<DataTemplate x:Key="{x:Type local:Client}">
В качестве альтернативы используйте ItemsControl.ItemTemplateSelector, чтобы явно указывать на разные DataTemplates в зависимости от типа элемента.Ot если вам действительно нужно использовать ControlTemplates, ознакомьтесь с ItemsControl.ItemContainerStyleSelector .