DataGrid не полное заполнение из ItemResource

Есть класс

public class SomeClass
    {
        public string info { get; set; }
        public long id { get; set; }
        public string trunc { get; set; }
        public int numbr { get; set; }
        public double price { get; set; }
    }

Я его вывожу в DataGrid MainDataGrid.ItemsSource = SomeClass;

Он выводится весь. Как можно вывести определённую информацию? Допустим, нужно вывести только id и price.


Ответы (1 шт):

Автор решения: aepot

Установите в xaml свойство для DataGrid - AutoGenerateColumns="False" и опишите колонки вручную.

<DataGrid ItemsSource="{Binding SomeClassCollection}" AutoGenerateColumns="False">
    <DataGrid.Columns>
        <DataGridTextColumn Header="Id" Binding="{Binding Id}"/>
        <DataGridTextColumn Header="Price" Binding="{Binding Price}"/>
    </DataGrid.Columns>
</DataGrid>

Создайте коллекцию, в которой будут храниться данные

public ObservableCollection<SomeClass> SomeClassCollection = new ObservableCollection<SomeClass>();

Чтобы DataGrid увидел эту коллекцию из xaml, нужно установить правильный DataContext у вашего окна, где находится сама таблица. Подробнее об этом можно узнать почитав про шаблон программирования MVVM.

По сути эта коллекция - то же самое что и List, только внутри себя внутри вызывает событие CollectionChanged при добавлении или удалении элементов, что сразу же замечает DataGrid и обновляет свой интефейс автоматически.

Сделайте так, чтобы класс SomeClass реализовал INotifyPropertyChanged для того, чтобы класс узнавал об изменениях, которые вносятся в ячейки таблицы вами, а таблица узнавала об изменениях, которые вносятся в данные класса из кода. За этим, собственно, и придуман Binding.

using System.ComponentModel;

public class SomeClass : INotifyPropertyChanged
{
    private string _info;
    private long _id;
    private string _trunc;
    private int _number;
    private double _price;

    public string Info
    {
        get => _info; // то же самое что get { return _info; }
        set
        {
            _info = value;
            OnPropertyChanged(nameof(Info)); // nameof(Info) здесь означает строку "Info"
        }
    }

    public long Id
    {
        get => _id;
        set
        {
            _id = value;
            OnPropertyChanged(nameof(Id));
        }
    }

    public string Trunc
    {
        get => _trunc;
        set
        {
            _trunc = value;
            OnPropertyChanged(nameof(Trunc));
        }
    }

    public int Number
    {
        get => _number;
        set
        {
            _number = value;
            OnPropertyChanged(nameof(Number));
        }
    }

    public double Price
    {
        get => _price;
        set
        {
            _price = value;
            OnPropertyChanged(nameof(Price));
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    protected virtual void OnPropertyChanged(string propertyName) => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
→ Ссылка