2016-05-06 4 views
0

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.

+0

Die Reihenfolge, an die Sie gebunden sind, ist nicht dieselbe, die Sie in Ihrem Ereignishandler ändern. –

+0

wie fügen Sie OrderItem zu Ihrer Bestellung? – Nitin

+0

@Nitin By GetOrderDetails (Zeichenfolge customerId) -Methode OrderItems werden zur ObservableCollection hinzugefügt OrderItems –

Antwort

1

ist Ihr Gitter an die Order statische Ressource gebunden:

<Window.Resources> 
    <model:Order x:Key="Order"/> 
</Window.Resources> 

<DataGrid DataContext="{Binding Source={StaticResource Order}}" ... 

In Ihrem Event-Handler, werden Sie eine neue Order Instanz:

Order _order = new Order(); 

Sie werden dann eine Methode aufrufen, die Sie sagen wir, fügt ein OrderItem zu der OrderItems Sammlung in _order hinzu. Dies ist nicht die OrderItems Sammlung Ihrer DataGrid.ItemsSource ist verpflichtet.

könnte eine einfache Lösung, um Ihre Order in dem in der Code-behind zu erklären und an die DataContext im Konstruktor zuweisen:

private readonly Order _order = new Order(); 

public WindowName() 
{ 
    DataContext = _order; 
} 

dann die DataContext entfernen von Ihrem DataGrid (es verbindlich die Window.DataContext erbt). Dann können Sie Order _order = new Order() von Ihren Event-Handler entfernen und das Instanzfeld _order stattdessen verwenden.

Im Idealfall wäre Ihr Event-Handler nicht erforderlich und es wäre ein ICommand in Ihrem Order, der an jeden Knopf gebunden wäre, sollte eine neue Bestellung hinzufügen.