Расчёт итоговой суммы c# wpf

Нужно в поле вывести итоговую сумму, которая должна автоматически пересчитываться при изменении количества или цены. Структура класса и прочее: Автоматический расчет в столбце Datagrid

Я создала отдельное свойство и привязала к Textblock на форме, но он ничего не выводит. Даже при загрузке формы. Но само свойство меняется и при выходе из формы в MessageBox показывает правильное значение.

Вот форма: введите сюда описание изображения

При выходе из формы: введите сюда описание изображения


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

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

Т.к. свойство для расчёта итоговой суммы находится у меня в статическом классе, как и все коллекции, то для этого свойства я нашла код, реализующий 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>

Всё работает и без UpdateSourceTrigger. введите сюда описание изображения

→ Ссылка