2016-05-06 5 views
0

Я уже проверил эти ссылки, но не решил свою проблему.Как связать 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}" 

Может ли кто-нибудь указать мне, как преодолеть эту проблему.

+0

«Порядок», с которым вы связаны, не является тем же, который вы изменяете в обработчике событий. –

+0

как вы добавляете OrderItem в свой заказ? – Nitin

+0

@Nitin By GetOrderDetails (string customerId) метод OrderItems добавляются в ObservableCollection OrderItems –

ответ

1

Ваша сетка привязывается к Order статического ресурса:

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

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

В обработчике события, вы создаете новый Order экземпляр:

Order _order = new Order(); 

Затем вы вызываете метод, который вы скажем, добавляет OrderItem в коллекцию OrderItems в _order. Это неOrderItems коллекция ваших DataGrid.ItemsSource обязана.

Простое исправление может быть, чтобы объявить Order в в коде позади и назначить его DataContext в конструкторе:

private readonly Order _order = new Order(); 

public WindowName() 
{ 
    DataContext = _order; 
} 

Затем удалите DataContext связывания с вашего DataGrid (он унаследует Window.DataContext). Затем вы можете удалить Order _order = new Order() из обработчика событий и вместо этого использовать поле экземпляра _order.

В идеале, ваш обработчик событий не требуется, и в вашем Order будет ICommand, который будет привязан к любой кнопке, которая должна добавить новый заказ.

Смежные вопросы