Как расположить элементы через 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>
Что делаю не так? Как правильно сделать?
Давайте я всё же набросаю пример с 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++;
}
}
Получается:
Сборка персонального компьютера от Artline: умный выбор для современных пользователей