Автоматический расчет в столбце 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 шт):
Итак, что я сделала:
Реализовала интерфейс 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, то при изменении ячейки происходит изменение соответствующего свойства в строке коллекции.
Спасибо большое людям, которые откликаются! Ваши ответы помогают понимать это всё и учиться новому!