Вывести элементы в виде таблицы WPF

247
30 марта 2018, 09:55

Как расположить элементы через Binding в виде таблицы? DataGrid не предлагайте, не подходит.

Когда делаю вручную

<ItemsControl ItemsSource="{Binding CurrentTable.MyRows}">
                <ItemsControl.ItemTemplate>
                    <DataTemplate>
                        <UniformGrid Columns="{Binding Cells.Count}">
                            <TextBlock Text="{Binding Cells[0].Text}"/>
                            <TextBlock Text="{Binding Cells[1].Text}"/>
                            <TextBlock Text="{Binding Cells[2].Text}"/>
                            <TextBlock Text="{Binding Cells[3].Text}"/>
                            <TextBlock Text="{Binding Cells[4].Text}"/>
                        </UniformGrid>
                    </DataTemplate>
                </ItemsControl.ItemTemplate>
            </ItemsControl>

Всё работает. Если пробую биндить, не выходит

<ItemsControl ItemsSource="{Binding CurrentTable.MyRows}">
                <ItemsControl.ItemTemplate>
                    <DataTemplate>
                        <UniformGrid Columns="{Binding Cells.Count}">
                            <ItemsControl ItemsSource="{Binding Cells}">
                                <ItemsControl.ItemTemplate>
                                    <DataTemplate>
                                        <TextBlock Text="{Binding Text}"/>
                                    </DataTemplate>
                                </ItemsControl.ItemTemplate>
                            </ItemsControl>
                        </UniformGrid>
                    </DataTemplate>
                </ItemsControl.ItemTemplate>
            </ItemsControl>

Что делаю не так? Как правильно сделать?

Answer 1

Давайте я всё же набросаю пример с GridView.

Начнём со структуры данных. Я отделю заголовки столбцов от информации в столбцах.

Выходит:

class Table
{
    public string[] Headers { get; set; }
    public IEnumerable<string[]> Rows { get; set; }
}

Окей, у нас переменное количество столбцов, которое мы не знаем. Тогда сгенерируем столбцы на лету. Чтобы получать нотификацию, когда свойство Headers поменяется, воспользуемся трюком с невидимым элементом. (Чтобы это работало, ваш класс Table должен ещё и поддерживать интерфейс INotifyPropertyChanged!)

Наш XAML получается совсем простым.

<Grid Visibility="Collapsed" Name="Dummy" DataContext="{Binding Headers}"
      DataContextChanged="OnRowsChanged"/>
<ListView ItemsSource="{Binding Rows}" Name="List">
    <ListView.View>
        <GridView AllowsColumnReorder="True" x:Name="GridView"/>
    </ListView.View>
</ListView>

Ну и немного code-behind:

void OnRowsChanged(object sender, DependencyPropertyChangedEventArgs e)
{
    var rows = (IEnumerable<string>)((FrameworkElement)sender).DataContext;
    GridView.Columns.Clear();
    int no = 0;
    foreach (var row in rows)
    {
        GridView.Columns.Add(new GridViewColumn()
            {
                Header = row,
                DisplayMemberBinding = new Binding($"[{no}]")
            });
        no++;
    }
}

Получается:

READ ALSO
Получить имя контроллера asp.net при помощи nameof

Получить имя контроллера asp.net при помощи nameof

Внимание! Это перевод вопроса How to use C# nameof() with ASPNET MVC Url

217
VS загружает ЦП на 40%

VS загружает ЦП на 40%

Товарищи, тут возникла следующая проблемка: имею в VS проект на С#, в котором имеется статический класс, в статическом инициализаторе которого...

200
Помогите превести код из C++ в С# [требует правки]

Помогите превести код из C++ в С# [требует правки]

Помогите перевести код из С++ в С#

196
Направление гравитации Particle System [Unity, C#]

Направление гравитации Particle System [Unity, C#]

Как задать направление гравитации по оси Z для частиц Particle System в Unity используя С#Желательно чтобы ось Z синхронизировалась с осью Z другого...

210