0

Всем привет. Возникла проблема с динамическим выводом данных из коллекции. У меня есть коллекция коллекций которую мне нужно вывести в DataGrid. Когда делаю бинд на свою коллекцию, то ничего не выводится, если сделать автоматическую генерацию столбцов то выводится только свойства коллекции, кроме данных. Получается только через статический вывод по столбцам если указать индекс. Подскажите пожалуйста как сделать динамическую генерацию столбцов с данными

VM:

 public class MainWindowViewModel : ViewModelBase
    {
    public ReactiveCommand<Unit, Unit> Click { get; set; }
private ObservableCollection&lt;ObservableCollection&lt;string&gt;&gt; _table = new ObservableCollection&lt;ObservableCollection&lt;string&gt;&gt;();

public ObservableCollection&lt;ObservableCollection&lt;string&gt;&gt; Table
{
    get =&gt; _table;
    set =&gt; this.RaiseAndSetIfChanged(ref _table, value);
}

public MainWindowViewModel()
{
    Table = new ObservableCollection&lt;ObservableCollection&lt;string&gt;&gt;();
    Click = ReactiveCommand.Create(() =&gt;
    {
        Table.Add(new (){&quot;asdasd&quot;, &quot;asdasd&quot;});
        Table.Add(new (){&quot;asdasd&quot;});
        Table.Add(new (){&quot;asdasd&quot;, &quot;asdasd&quot;});
        Table.Add(new (){&quot;asdasd&quot;, &quot;asdasd&quot;});
        Table.Add(new (){&quot;asdasd&quot;, &quot;asdasd&quot;});
    });
}

}

View:

<StackPanel>
        <Button Content="click" Command="{Binding Click}"></Button>
        <DataGrid ItemsSource="{Binding Table}" AutoGenerateColumns="True">
            <DataGrid.Columns>
                <DataGridTextColumn Binding="{Binding [0]}"></DataGridTextColumn>
                <DataGridTextColumn Binding="{Binding [1]}"></DataGridTextColumn>
            </DataGrid.Columns>
        </DataGrid>
    </StackPanel>
Mikhail
  • 70

1 Answers1

2

Используйте DataTable, пример использования: DataGrid c#. Как вносить значения в ячейки пользователю?

При этом динамически без принудительной перегенерации колонок это не сделать, так как DataGrid не расчитана на такое изменение в данных. В ответе по ссылке обратите внимание на строчку кода Data = Data.Copy(), это вызывает сеттер свойства данных и инициирует перегенерацию колонок. В принципе это работает незаметно для пользователя, но в каких-то случаях придется подкорректировать координаты выбранной ячейки, если потребуется.

Альтернативой может служить изготовление собственного контрола-таблицы, который будет отображать данные так как вам надо. Пример построения визуальный матрицы здесь (вложенный ItemsControl) или здесь (UniformGrid).

UPD: только после написания ответа увидел, что это Avalonia, а не WPF, но думаю, что логика решения задачи будет та же.

aepot
  • 49,560
  • Спасибо, попробую – Mikhail Feb 26 '24 at 07:36
  • Неплохо работает, только приходится вывод таблицы делать из view, как я понимаю для mvvm это не очень. но работает. так что спасибо – Mikhail Feb 29 '24 at 03:43