Обновить сетку данных WPF MVVM при закрытии Windows

#c# #wpf #mvvm #datagrid

#c# #wpf #mvvm #datagrid

Вопрос:

Я видел несколько ответов на SE на этот вопрос, но, похоже, на него не было дано полного ответа.

У меня есть окно, в котором есть сетка данных (frmOpenOrders.tblOpenOrders).

В окнах отображаются все открытые ордера в программе.

Я считаю, что я связал его правильно, но это мой первый проект WPF MVVM когда-либо.

XAML:

 <DataGrid x:Name="tblOpenOrders"  ItemsSource="{Binding}" Grid.Column="1" Grid.Row="2" 
                  IsReadOnly="true" RowHeaderWidth="0"    AutoGenerateColumns="False" CanUserAddRows="False">
  

CS:

 private BindableCollection<ViewModel.openOrder> CurrentOpenOrders { get; set; }
private void loadData()
        {
            
            string sqlString = @"SELECT tblOrder.orderID, firstName, lastName, tblOrder.itemName, tblOrder.itemQuantity, tblStaff.StaffName AS orderedBy, Format([createdDate],""hh:nn am/pm"") AS orderTime, Format([createdDate],""dd mmm"") AS orderDate
                                    FROM tblStaff INNER JOIN tblOrder ON tblStaff.staffID = tblOrder.createdBy WHERE orderedBy is null";


            using (OleDbConnection con = new OleDbConnection(cstring.con))
            {
                using (OleDbDataAdapter fillDA = new OleDbDataAdapter(sqlString, cstring.con))
                {

                    con.Open();
                    DataTable dt = new DataTable("tableData");
                    fillDA.Fill(dt);
                    con.Close();



                    CurrentOpenOrders = new BindableCollection<ViewModel.openOrder>();

                    foreach (DataRow dr in dt.Rows)
                    {
                        CurrentOpenOrders.Add(new ViewModel.openOrder
                        {
                            orderID = Convert.ToInt32(dr["orderID"].ToString()),
                            firstName = dr["firstName"].ToString(),
                            lastName = dr["lastName"].ToString(),
                            orderedBy = dr["orderedBy"].ToString(),
                            itemName = dr["itemName"].ToString(),
                            itemQuantity = Convert.ToInt32(dr["itemQuantity"].ToString()),
                            orderedTime =dr["orderTime"].ToString(),
                            orderedDate = dr["orderDate"].ToString()

                        });
                        
                        
                    }
                    tblOpenOrders.DataContext = CurrentOpenOrders;
                }
            }
        }
  

ViewModel:

 public class ViewModel
    {

        public class openOrder
        {
            public int orderID { get; set; }
            public string orderedDate { get; set; }
            public string orderedTime { get; set; }
            public string firstName { get; set; }
            public string lastName { get; set; }
            public string itemName { get; set; }
            public int itemQuantity { get; set; }
            public string orderedBy { get; set; }
        }
    }
  

Кажется, он работает правильно, но я рад получить совет по поводу ошибок в нем.

Теперь в сетке данных у меня есть кнопка, чтобы открыть дочернее окно для записи этой строки (frmProcessOrder) Это тоже работает нормально.

Мне нужно, чтобы сетка данных в Window1 (tblOpenOrders) обновлялась при закрытии дочернего элемента. В значительной степени (frmProcessOrder) закрывается, и это должно удалить эту запись из сетки данных, поскольку этот порядок был обработан.

Насколько я понимаю, мне нужно обновить связываемую коллекцию …?

Мой другой вариант — просто закрыть frmOpenOrders при открытии дочернего элемента, затем, когда дочерний элемент откроется, я снова открою frmOpenOrders, которые, таким образом, будут в порядке и обновлены.

Спасибо за любой совет, я просто не мог понять это.

Гангель

Комментарии:

1. У вас есть ссылка на пользовательский интерфейс в loaddats. Это не mvvm. У вас должен быть отдельный класс viewmodel. Это реализует inotifypropertychanged . Если вы заменяете связанную коллекцию, это должно вызвать propertychanged в ее установщике. Эта viewmodel должна работать, если экземпляр создан без представления. Экземпляр viewmodel должен быть datacontext представления. Itemssource сетки данных должен привязываться к свойству из viewmodel, предоставляющему коллекцию.

2. Спасибо @Andy, очевидно, что мои навыки еще не готовы к этому, поскольку это в значительной степени перешло через мою голову. Я изучу это подробнее и попытаюсь сначала запустить этот материал MVVM.