0

На основном экране есть два ListView.

В первом выводится список продукции, во втором корзина. В режиме админа По клику на продукции я могу отредактировать удалить продукции, и список обновляется.

Когда я добавляю в корзину эту продукцию, список не обновляется. Как сделать, чтобы второй Listview обновлялся?

Вот код класса:

public partial class MainWindow : Window, INotifyPropertyChanged
        {
public event PropertyChangedEventHandler PropertyChanged;
        public event PropertyChangedEventHandler PropertyChanged1;
       //  public IEnumerable<Sale> SaleList { get; set; }


        public MainWindow()
        {
            InitializeComponent();
            DataContext = this;
            Globals.DataProvider = new MySQLDataprovider();
            ProductType1();
            productMetod();
            productMetod1();
            metodA();

        }

        private async void productMetod1()
        {
            ProductTypeList = (await Globals.DataProvider.GetProductTypes()).ToList();

        }


            private async void productMetod()
        {
            /*получение товара list*/
            TovarList = await Globals.DataProvider.GetTovar();
        }

        private async void ProductType1()
        {
            ProductTypes = await Globals.DataProvider.GetProductTypes();
        }




        private async void metod()
        {
            TovarList = await Globals.DataProvider.GetTovar();
        }



        private IEnumerable<Sale> _SaleList;


        public IEnumerable<Sale> SaleList
        {
            get {
                var Result = _SaleList;
            return Result;
            } 
            set
            {
                _SaleList = value;
                Invalidate1();
            }
        }



        private void ProductListView_MouseDoubleClick_1(object sender, MouseButtonEventArgs e)
        {

            var NewSaleWindow = new SaleWindow(ProductListView.SelectedItem as Tovar);


            if ((bool)NewSaleWindow.ShowDialog())
            {
                metodA();
                Invalidate1();


            }


        }

        private void metodA()
        {
            SaleList = Globals.DataProvider.GetSale();
        }


//вот этот работает метод и обновляет список private void Invalidate() { if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("TovarList") ); } //а вот это не работает private void Invalidate1(string ComponentName = "SaleList") { if (PropertyChanged1 != null) PropertyChanged1(this, new PropertyChangedEventArgs(ComponentName)); }

        public Sale ChangedProduct11 { get; set; }


    }
}

ilya
  • 55
  • 4
  • 1
    Это делается через ICollectionView – aepot Mar 28 '22 at 10:30
  • спасибо ,можете примерно обьяснить как это делать? – ilya Mar 28 '22 at 10:32
  • Здесь можно посмотреть: https://ru.stackoverflow.com/a/1131976/373567, плюс познакомьтесь с ObservableCollection, для изменяемых списков просто используйте ее вместо List. – aepot Mar 28 '22 at 10:42
  • спасибо!!!!!!!! – ilya Mar 28 '22 at 10:44
  • я попытался применить код к программе ,но у меня все также не обновляется .я впервые про такую функцию узнал ICollectionView и ObservableCollection ,но применить не получается, помогите пожалуйста мне применить эти функции к моему коду – ilya Mar 28 '22 at 11:58
  • А с PropertyChanged,INotifyPropertyChanged не получиться? – ilya Mar 28 '22 at 12:00
  • Перестаньте использовать async void и все получится, используйте async Task и await, async void только в обработчиках событий уместен, и то не всегда. – aepot Mar 28 '22 at 12:24
  • Уберите свой код из конструктора MainWindow, используйте обработчик Window_Loaded вместо этого, ему можно async прописать, и в нем каждому из вызываемых асинхронных методов допишите await а в сигнатуре вызываемых асинхронных методов замените void на Task. Тогда они будут выполняться последовательно, а не вразнобой. Если надо вразнобой, то есть await Task.WhenAll(методы) https://docs.microsoft.com/ru-ru/dotnet/csharp/async – aepot Mar 28 '22 at 12:26

0 Answers0