Я уже проверил эти ссылки, но не решил свою проблему.Как связать ObservableCollection с datagrid WPF
У меня есть две модели классов (Order.cs и OrderItems.cs) и View (Invoice.xaml)
Существует ObservableCollection (OrderItem) в классе Order и datagrid в Invoice.xaml. Мне нужно привязать ObservableCollection к datagrid. Проблема в том, что привязка с помощью написания кодов xaml автоматически не обновляет datagrid, когда элементы добавляются в ObservableCollection.
коды приведены ниже
Order класса
public class Order
{
public Order()
{
OrderItems =new ObservableCollection<OrderItem>();
}
public ObservableCollection<OrderItem> OrderItems { get; set; }
public void GetOrderDetails(string customerId)
{
// method for getting set of OrderItmes objects and add to the
// ObservableCollection<OrderItem>
}
}
OrderItem Class
public class OrderItem
{
public OrderItem(string supplierId, string itemId, string itemName,decimal weight)
{
// some codes here
}
public string SupplierId { get; set; } // Supplier's ID
public string ItemId { get; set; } // Item ID
public string ItemName { get; set; }// Item Name
public decimal Weight { get; set; } // weight of the item
}
XAML код Invoice.xaml (для простоты показаны только необходимые коды. Модель - это пакет классов Order и OrderItem.
xmlns:model="clr-namespace:Onion.Model"
<Window.Resources>
<model:Order x:Key="Order"/>
</Window.Resources>
<DataGrid x:Name="dataGrid" AutoGenerateColumns="False" CanUserResizeRows="False" Grid.ColumnSpan="8"
Margin="0,0,30.5,0" CanUserResizeColumns="False" CanUserReorderColumns="False"
CanUserSortColumns="False" CanUserAddRows="False" IsReadOnly="True"
DataContext="{Binding Source={StaticResource Order}}" ItemsSource="{Binding OrderItems}">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding SupplierId}" CanUserResize="False" FontSize="16"
Header="Supplier" Width="0.18*" />
<DataGridTextColumn Binding="{Binding ItemId}" CanUserResize="False" FontSize="16"
Header="ItemID" Width="0.13*" />
<DataGridTextColumn Binding="{Binding ItemName}" CanUserResize="False" FontSize="16"
Header="Item name" Width="0.2*" />
<DataGridTextColumn Binding="{Binding Weight}" CanUserResize="False" FontSize="16"
Header="Weight" Width="0.1*" />
</DataGrid>
Но я могу достичь этого, не записывая коды xaml, написав код в классе Invoice.xaml.cs, где это необходимо.
private void txtBox_PreviewKeyDown(object sender, KeyEventArgs e){
Order _order = new Order();
_order.GetOrderDetails(customerId);// add OrderItems to the ObservableCollection
// If this code is written some xaml codes are not needed (they are shown below in the question
dataGrid.ItemsSource = _order.OrderItems; // OrderItems is the ObservableCollection<OrderItem>
}
(включая связывание каждого столбца к свойству в OrderItem) Эти коды не нужны, если линия dataGrid.ItemsSource = _order.OrderItems; используется.
xmlns:model="clr-namespace:Onion.Model"
<Window.Resources>
<model:Order x:Key="Order"/>
</Window.Resources>
DataContext="{Binding Source={StaticResource Order}}" ItemsSource="{Binding OrderItems}"
Может ли кто-нибудь указать мне, как преодолеть эту проблему.
«Порядок», с которым вы связаны, не является тем же, который вы изменяете в обработчике событий. –
как вы добавляете OrderItem в свой заказ? – Nitin
@Nitin By GetOrderDetails (string customerId) метод OrderItems добавляются в ObservableCollection OrderItems –