Ich habe diese Links bereits überprüft, aber mein Problem nicht gelöst.So binden Sie ObservableCollection mit Datagrid WPF
Ich habe zwei Modellklassen (Order.cs und OrderItems.cs) und eine Ansicht (Invoice.xaml)
Es gibt ObservableCollection (OrderItem) in Order-Klasse und ein Datagrid in Invoice.xaml. Ich muss ObservableCollection an das Datagrid binden. Problem ist, Bindung durch das Schreiben von XAML-Codes aktualisiert das Datagrid nicht automatisch, wenn Elemente zur ObservableCollection hinzugefügt werden.
Codes sind unter
Bestellen Klasse
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 Klasse
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-Code des Invoice.xaml (für die Einfachheit nur die notwendigen Codes angezeigt werden angezeigt. Modell ist das Paket der Klassen Order und 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>
Aber ich kann dies erreichen, ohne die XAML-Codes zu schreiben, indem ich den Code in der Invoice.xaml.cs-Klasse schreibe, wo es notwendig ist.
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>
}
(einschließlich der Bindung jeder Spalte auf eine Eigenschaft in OrderItem) folgenden Codes, wenn die Leitung nicht notwendig sind dataGrid.ItemsSource = _order.OrderItems; wird eingesetzt.
xmlns:model="clr-namespace:Onion.Model"
<Window.Resources>
<model:Order x:Key="Order"/>
</Window.Resources>
DataContext="{Binding Source={StaticResource Order}}" ItemsSource="{Binding OrderItems}"
Kann mir jemand zeigen, wie dieses Problem zu überwinden.
Die Reihenfolge, an die Sie gebunden sind, ist nicht dieselbe, die Sie in Ihrem Ereignishandler ändern. –
wie fügen Sie OrderItem zu Ihrer Bestellung? – Nitin
@Nitin By GetOrderDetails (Zeichenfolge customerId) -Methode OrderItems werden zur ObservableCollection hinzugefügt OrderItems –