Расчёт итоговой суммы c# wpf
Нужно в поле вывести итоговую сумму, которая должна автоматически пересчитываться при изменении количества или цены. Структура класса и прочее: Автоматический расчет в столбце Datagrid
Я создала отдельное свойство и привязала к Textblock на форме, но он ничего не выводит. Даже при загрузке формы. Но само свойство меняется и при выходе из формы в MessageBox показывает правильное значение.
Ответы (1 шт):
Т.к. свойство для расчёта итоговой суммы находится у меня в статическом классе, как и все коллекции, то для этого свойства я нашла код, реализующий INPC для статических свойств:
namespace Primer_prog
{
class Primer //Класс находится в корне проекта
{
public static ObservableCollection<Post_zakaz> postzakazis = new ObservableCollection<Post_zakaz>(); //Коллекция для хранения товаров
public static double sum_p; //Переменная для хранения итогового значения
public static double Sum_ps //Свойство поля sum_p
{
get
{
return sum_p;
}
set
{
sum_p = value;
NotifyStaticPropertyChanged("Sum_ps"); //Указываем, что свойство изменилось
}
}
public static double Sum_post() //Расчёт суммы из коллекции
{
double sum = 0;
foreach (var r in postzakazis)
{
sum += r.Obsh;
}
return sum;
}
public static void Set_tovpost() //Заполнение коллекции
{
SqlCommand s1 = new SqlCommand("Select T.Kod, T.Nazv, [dbo].[Null_val](Ri.Kod), [dbo].[Null_str](Ri.Nazv), Sp.Kol, Sp.Cena_tov from Tovari T, Raznovidnosti_ingr Ri right join Sostav_postavki Sp on Ri.Kod = Sp.Razn where T.Kod = Sp.Tovar and Sp.Kod_postavki = " + Util.kod_post, conK);
SqlDataReader dr = s1.ExecuteReader();
while (dr.Read())
{
int a = dr.GetInt32(0);
string b = dr.GetString(1);
int c = dr.GetInt32(2);
string d = dr.GetString(3);
double e = dr.GetDouble(4);
double f = dr.GetDouble(5);
postzakazis.Add(new Post_zakaz(a, b, c, d, e, f));
}
dr.Close();
Sum_ps = Sum_post();
}
/////////////////////////Реализация INPC для статических свойств
public static event EventHandler<PropertyChangedEventArgs> StaticPropertyChanged;
private static void NotifyStaticPropertyChanged([CallerMemberName] string propertyName = null)
{
if (StaticPropertyChanged != null)
{
StaticPropertyChanged(null, new PropertyChangedEventArgs(propertyName));
}
}
}
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; Util.Sum_ps = Util.Sum_post(); OnPropertyChanged("Obsh"); } }//Тут при установке другого значения вызывается метод и присваивается свойству повторно, т.е. пересчёт происходит полностью.
public double Cena_ed
{ get { return cena_ed; } set { cena_ed = value; Util.Sum_ps = Util.Sum_post(); 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));
}
}
}
}
В разметке XAML подключила пространство имён
xmlns:loc="clr-namespace:TestKafe"
т.к. форма находится в другой папке.
Далее к нужному TextBlock добавляю привязку:
<TextBlock VerticalAlignment="Center" Text="{Binding Path=(loc:Util.Sum_ps), Mode=OneWay}"></TextBlock>


