Вопрос

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

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

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

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

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

Это было полезно?

Решение

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

Другие советы

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top