Автоматический расчет в столбце Datagrid

У меня есть класс Post_zakaz

public class Post_zakaz
{
    public Post_zakaz(int kod_t, string nazv_t, int kod_r, string nazv_r, double kol, double cena_ed)
    {
        this.kod_t = kod_t;
        this.nazv_t = nazv_t;
        this.kod_r = kod_r;
        this.nazv_r = nazv_r;
        this.kol = kol;
        this.cena_ed = cena_ed;
        this.obsh = kol * cena_ed;
    }
    public int index { get; set; }
    public int kod_t { get; set; }
    public string nazv_t { get; set; }
    public int kod_r { get; set; }
    public string nazv_r { get; set; }
    public double kol { get; set; }
    public double cena_ed { get; set; }
    public double obsh { get; set; }
}

Есть переменная для хранения значений, полученных из базы:

public static ObservableCollection<Post_zakaz> postzakazis = new ObservableCollection<Post_zakaz>();

Далее есть DataGrid с привязкой к коллекции:

<DataGrid Name="Grid" Grid.Row="1" ItemsSource="{Binding Mode=OneWay}" AutoGenerateColumns="False">
    <DataGrid.Columns>
        <DataGridTextColumn Header="№"></DataGridTextColumn>
        <DataGridTextColumn Header="Товар" Width="*" IsReadOnly="True" Binding="{Binding Path=nazv_t}"></DataGridTextColumn>
        <DataGridTextColumn Header="Разновидность" Width="*" IsReadOnly="True" Binding="{Binding Path=nazv_r}"></DataGridTextColumn>
        <DataGridTextColumn Header="Количество" Width="*" Binding="{Binding Path=kol}" ></DataGridTextColumn>
        <DataGridTextColumn Header="Цена за ед" Width="*" Binding="{Binding Path=cena_ed}"></DataGridTextColumn>
        <DataGridTextColumn Header="Общая сумма" Width="*" Binding="{Binding Path=obsh}"></DataGridTextColumn>
    </DataGrid.Columns>

</DataGrid>

В столбце "Общая сумма" при изменении одного из полей "Количество" или "Цена за ед" должен происходить перерасчет "Общей суммы". Сейчас она рассчитывается только при заполнении, т.к. поле obsh из класса Post_zakaz присваивается один раз.

Я так поняла, что нужно реализовывать INotifyPropertyChanged для класса? Пока я от этого далека, но пытаюсь понять.

Как правильно реализовать данную идею? Возможно как-то можно изменять столбец в самом DataGrid?


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

Автор решения: A B

Итак, что я сделала:

Реализовала интерфейс INPC (пока не полностью понимая как он работает. Просто зная, что он делает)

public class Post_zakaz : INotifyPropertyChanged // "подключаем" интерфейс
{
    public Post_zakaz(int kod_t, string nazv_t, int kod_r, string nazv_r, double kol, double cena_ed)
    {
        this.kod_t = kod_t;
        this.nazv_t = nazv_t;
        this.kod_r = kod_r;
        this.nazv_r = nazv_r;
        this.kol = kol;
        this.cena_ed = cena_ed;
        this.obsh = kol * cena_ed;
    }

    private int kod_t, kod_r;
    private string nazv_t, nazv_r;
    public double kol, cena_ed, obsh;
    public int Kod_t 
    { get { return kod_t; } set { kod_t = value; OnPropertyChanged() /* Этот метод указывает на то, какое свойство должно измениться. Если он пустой, то ничего не меняет*/; } }
    public string Nazv_t
    { get { return nazv_t; } set { nazv_t = value; OnPropertyChanged(); } }
    public int Kod_r
    { get { return kod_r; } set { kod_r = value; OnPropertyChanged(); } }
    public string Nazv_r
    { get { return nazv_r; } set { nazv_r = value; OnPropertyChanged(); } }
    public double Kol
    { get { return kol; } set { kol = value; OnPropertyChanged("Obsh") /*В данном случае при установке значения этот метод оповещает свойство "Obsh" что ему пора поменять значение (как я поняла, повторно вызвать set обновляемого свойства) */; } }
    public double Cena_ed
    { get { return cena_ed; } set { cena_ed = value; OnPropertyChanged("Obsh"); } }
    public double Obsh
    { get { return kol * cena_ed; } }

    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        if (PropertyChanged != null) //если при вызове метода есть параметр
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); //тут что-то пока непонятное для меня
        }
    }

Ну и впринципе всё! Далее, если соответствующая коллекция привязана к DataGrid, то при изменении ячейки происходит изменение соответствующего свойства в строке коллекции.

Спасибо большое людям, которые откликаются! Ваши ответы помогают понимать это всё и учиться новому!

→ Ссылка