У меня есть WPF ListBox из Сетки, что я создаю следующим образом:WPB ListBox связываются контролировать внутри класса
Я определяю ListBox в XAML с простой декларации следующим образом:
<ListBox Name="MyListbox" >
</ListBox>
В коде , Я динамически создаю произвольное количество элементов Grid (System.Windows.Controls.Grid), и я добавляю их в ListBox. Что-то вроде:
foreach (MyDataType myItem in MyDataList)
{
Grid newGrid = new Grid();
// Code that sets the properties and values of the grid, based on myItem
MyListbox.Items.Add(newGrid);
}
Это прекрасно работает, и все выглядит так, как я хочу.
Теперь я решил, что в моем ListBox я также хочу сохранить ссылку на фактический объект myItem, так что я могу ссылаться на него позже.
Моя идея состояла в том, чтобы создать новый класс, как:
public class ListGridItemNode
{
public MyDataType theItem;
public Grid theGrid;
public ListGridItemNode(MyDataType inItem, Grid inGrid)
{
theItem = inItem;
theGrid = inGrid;
}
}
А затем изменить мой код:
foreach (MyDataType myItem in MyDataList)
{
Grid newGrid = new Grid();
// Code that sets the properties and values of the grid, based on myItem
MyListbox.Items.Add(new ListGridItemNode(myItem,newGrid));
}
Конечно, теперь мой ListBox вместо отображения сетки, просто отображает текст «MyApp.ListGridItemNode».
Мой вопрос: Как сообщить ListBox идти глубже на уровень и отображать фактические сетки внутри каждого объекта ListGridItemNode?
Я подозреваю, что это связано с привязками, но я не могу найти примеров, которые работают так, как я это делаю. Большая часть того, что я нахожу, только показывает привязку к строке внутри объекта, а не к целому элементу управления.
Причина, по которой вы не можете найти в документации на том, что * это не предназначено быть сделано *. Вы создаете элементы управления, которые привязываются к данным, используя шаблоны элементов, чтобы определять * как * данные отображаются. Вам не следует динамически добавлять элементы управления элементами. – BradleyDotNET
Не создавайте элементы интерфейса в коде. Вместо этого создайте правильный DataTemplate для элементов ListBox. Взгляните на статью [Data Templating Overview] (http://msdn.microsoft.com/en-us/library/ms742521.aspx) в MSDN. – Clemens
На самом деле это странно, наоборот (ListBoxes в сетке) понятна. Как вы будете иметь дело с синим фокусом над вашими сетками? Если вам нужна коллекция сеток, оберните их внутри ItemsControl или StackPanel, например. – Aybe