WPF Grid привязка данных - PullRequest
2 голосов
/ 31 июля 2009

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

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

Пока мои мысли:

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

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

Ответы [ 3 ]

3 голосов
/ 03 августа 2009

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

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

3 голосов
/ 31 января 2010

Я не думаю, что модификация Grid на лету - ваш лучший выбор. Вот еще одно решение. Вы можете использовать ListBox, но замените ItemsPanel другой панелью по вашему выбору. Элемент ItemsBanel по умолчанию ListBox имеет значение VirtualizingStackPanel с ориентацией по вертикали. Поскольку вы хотите, чтобы ваши элементы отображались горизонтально, вы можете заменить его на VirtualizingStackPanel с ориентацией, установленной на Горизонтальный . Конечно, вы можете изменить ItemTemplate или что-либо еще, как считаете нужным.

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

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

2 голосов
/ 31 июля 2009

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

...