#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.