2014-09-10 3 views
0

У меня есть 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?

Я подозреваю, что это связано с привязками, но я не могу найти примеров, которые работают так, как я это делаю. Большая часть того, что я нахожу, только показывает привязку к строке внутри объекта, а не к целому элементу управления.

+0

Причина, по которой вы не можете найти в документации на том, что * это не предназначено быть сделано *. Вы создаете элементы управления, которые привязываются к данным, используя шаблоны элементов, чтобы определять * как * данные отображаются. Вам не следует динамически добавлять элементы управления элементами. – BradleyDotNET

+0

Не создавайте элементы интерфейса в коде. Вместо этого создайте правильный DataTemplate для элементов ListBox. Взгляните на статью [Data Templating Overview] (http://msdn.microsoft.com/en-us/library/ms742521.aspx) в MSDN. – Clemens

+0

На самом деле это странно, наоборот (ListBoxes в сетке) понятна. Как вы будете иметь дело с синим фокусом над вашими сетками? Если вам нужна коллекция сеток, оберните их внутри ItemsControl или StackPanel, например. – Aybe

ответ

1

Не могли бы вы использовать свойство Tag объекта Grid?

newGrid.Tag = myItem; 

Тогда позже:

Grid grid; // obtain Grid object somehow 
MyItem myItem = (MyItem) grid.Tag; 
+0

Это отличное альтернативное решение, и это сработало для меня. Если в течение нескольких дней никто не сможет решить мою первоначальную идею, я соглашусь с этим. – JoeMjr2

Смежные вопросы