2016-11-29 2 views
0

я могу изменить значение столбца Quanity в сетке данных, но я не могу показаться, чтобы обновить общую ценовую колонку той же строке, используя событие celleditending это мой XAMLзначение одного столбца в сетке, изменив другой

<DataGrid AutoGenerateColumns="False" EnableColumnVirtualization="False" EnableRowVirtualization="False" IsSynchronizedWithCurrentItem="True" SelectedItem="{Binding SelectedItem}" Grid.Row="3" Grid.ColumnSpan="2" Name="DataGrid1" ItemsSource="{Binding DataGridItemsSource, Mode=TwoWay, IsAsync=True}" Margin="10,10,10,10" PreviewKeyDown="DataGrid1_PreviewKeyDown" SelectionChanged="DataGrid1_SelectionChanged" CellEditEnding="DataGrid1_CellEditEnding" BeginningEdit="DataGrid1_BeginningEdit" > 
    <DataGrid.Columns> 
     <DataGridTextColumn Header="Item Name" IsReadOnly="True" Binding="{Binding Path=ItemName}" Width="*"></DataGridTextColumn> 
     <DataGridTextColumn Header="Item Price" IsReadOnly="True" Binding="{Binding Path=ItemPrice}" Width="*"></DataGridTextColumn> 
     <DataGridTextColumn x:Name="QuantityColumn" Header="Quantity" IsReadOnly="False" Binding="{Binding Path=Quantity, Mode=TwoWay}" Width="*"></DataGridTextColumn> 
     <DataGridTextColumn Header="Total Price" IsReadOnly="True" Binding="{Binding Path=TotalPrice, Mode=TwoWay}" Width="*"></DataGridTextColumn> 
    </DataGrid.Columns> 
</DataGrid> 

И это мой C# WPF для

private void DataGrid1_CellEditEnding(object sender, DataGridCellEditEndingEventArgs e) 
{ 
    DataGrid dg = sender as DataGrid; 
    AddItem row = (AddItem)dg.SelectedItems[0]; 
} 

из этого я могу легко получить новое значение количества, но не могу показаться, чтобы выяснить, как обновить столбец totalprice моего datagrid.itemsource того же ряда. любая помощь будет оценена

public class AddItem : INotifyPropertyChanged 
     { 
      public event PropertyChangedEventHandler PropertyChanged; 
      public string ItemName { get; set; } 
      public float ItemPrice { get; set; } 
      public string Price { get; set; } 
      public int Quantity { get; set; } 
      public decimal TotalPrice { get; set; } 
      public int Size 
      { 
       get { return Quantity; } 
       set 
       { 
        Quantity = value; 
        if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("Size")); 
       } 
      } 
     } 

Это для AddItem, что я упускаю

+1

У вас есть свойства «Quantity» и «TotalPrice» в модели представления элементов. работайте с ними, это намного проще, чем использование события CellEditEnding. 'INotifyPropertyChanged' - ваш друг – ASh

+0

Также вы можете использовать ObservableCollection <> для свойства DataGridItemsSource. –

ответ

1

Предполагая, что TotalPrice = Quantity * ItemPrice, и это уже вычисленное свойство AddItem, вам нужно добавить PropertyChanged обработчик к каждому пункту:

foreach (var item in DataGridItemsSource) 
{ 
    item.PropertyChanged += item_PropertyChanged; 
} 

и добавить обработчик:

private void item_PropertyChanged(object sender, PropertyChangedEventArgs e) 
{ 
    switch (e.PropertyName) 
    { 
     case "Quantity": 
     case "ItemPrice": 
      PropertyChanged(this, "TotalPrice"); 
      break; 
    } 
} 

Это скажет пользовательскому интерфейсу, что общая цена изменилась и соответствующим образом обновит сетку.

Альтернативным решением будет расширение класса AddItem для отправки события PropertyChanged. Это отправит событие везде, где будет использоваться класс, а не только на эту конкретную модель представления.

Для того, чтобы это работать, ваша модель модели должна быть INotifyPropertyChanged.

+0

Я добавил модель AddItem. Что мне не хватает –

+0

Я добавил, что View Model i изменил привязку к additem, и теперь она дает ошибку в PropertyChanged (это, «TotalPrice»); не существует в текущем контексте –