2009-07-31 3 views
2

У меня есть сетка всего 1 ряд. Я хотел бы, чтобы количество столбцов определялось контекстом данных сетки.WPF Сетка данных привязка

Например, если у меня есть список имен, открытых в свойстве ObservableCollection под названием «Имена», которые возвращают «Fred», «Joe» и «Anne», мне бы хотелось, чтобы три столбца в сетке, каждая с текстовое поле, привязанное к каждому имени.

Мои мысли до сих пор:

1) Построить сетку вручную в коде-позади и перестраивать его при изменении ObservableCollection. Я не пошел с этим, поскольку это показалось немного неуклюжим, а не способ WPF делать вещи.

2) Создайте привязку со свойством Grid's ColumnDefinitions. Это показалось более правильным, но свойство Grid для ColumnDefinition не имеет свойства зависимостей.

+1

Вы хотите создать сетку или DataGrid? – kenwarner

ответ

3

Я не думаю, что изменение сетки на лету - ваш лучший выбор. Вот еще одно решение. Вы можете использовать ListBox, но замените ItemsPanel на другую панель по вашему выбору. ListBox по умолчанию ItemsPanel - VirtualizingStackPanel с ориентацией, установленной на Вертикаль. Поскольку вы хотите, чтобы ваши объекты отображались горизонтально, вы можете заменить его на VirtualizationStackPanel с ориентацией, установленной на Горизонтально. Конечно, вы можете изменить ItemsTemplate или что-нибудь еще, как вы сочтете нужным.

<ListBox ItemsSource="{Binding MyCollection}"> 
    <ListBox.ItemsPanel> 
     <ItemsPanelTemplate> 
      <VirtualizingStackPanel Orientation="Horizontal"/> 
     </ItemsPanelTemplate> 
    </ListBox.ItemsPanel> 
</ListBox> 

Я также использовал этот метод, прежде чем создать ListBox, который отображает элементы по горизонтали, но переносится на следующую строку, если он выбегает из комнаты на линии, с помощью WrapPanel. Вы также можете создавать свои собственные панели и подставлять их. Однажды я сделал панель, которая излагала ее в случайном порядке, и использовала ее для ListBox. Каждый элемент в моей связанной коллекции отображался в произвольной позиции в ListBox. Каждый раз, когда макет обновлялся, позиции приобретали новую позицию.

2

Если вы можете принимать имена в каждой строке, а не в каждом столбце, вы должны использовать ListView с представлением GridView View и настраиваемый CellTemplate, который является только связанным текстовым полем. Что-то вроде этого:

<ListView ItemsSource="{Binding Names}"> 
    <ListView.View> 
    <GridView> 
     <GridViewColumn> 
     <GridViewColumn.CellTemplate> 
      <!-- Your textbox goes in a DataTemplate here -->    
     </GridViewColumn.CellTemplate> 
     </GridViewColumn> 
    </GridView> 
    </ListView.View> 
</ListView> 

Решение № 2, к сожалению, невозможно в XAML. Решение №1 - ваш лучший выбор, если вы должны иметь каждое имя в своей колонке.

3

Если это DataGrid, то недвижимость AutoGenerateColumns сделает это. Используя DataGridTemplateColumn, вы можете поместить элементы управления текстовым полем, а не только текст. Вам нужно будет предоставить событие, прикрепленное к AutoGeneratingColumn, а также в AutoGeneratingColumnEventArgs (привет, Microsoft, это вызов туннеля в карпах), установите для свойства «Столбец» столбец шаблона с текстовым полем.

Я бы сказал, что ваш способ ObservableCollection проще; -P.

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