2017-05-16 4 views
0

Ich möchte einen Zellenwert entsprechend einer anderen Zelle in Datagrid aktualisieren. zum Beispiel habe ich eine Menge Spalte und eine Gesamtpreis Spalte , wenn ich die Menge ich triggern ein CellEditEnding Ereignis, das die Menge und einige logische Operation und speichern Sie es in der gesamten Preis Spalte der Zeile selbst. Danach ändert sich der Gesamtpreis nicht, nur nachdem ich die Gesamtpreiszelle für den Bearbeitungsmodus angeklickt habe, dann sehe ich das Ergebnis.Zellenwert aktualisieren Von einem anderen Zellenwert im Datagrid

meine Frage ist: Wie kann das Ergebnis direkt nach dem CellEditEnding sehen?

hier ist mein XAML:

<DataGrid Name="itemsInSheet" CanUserAddRows="False" PreviewTextInput="PreviewQuantityChanged" CellEditEnding="itemsInSheet_CellEditEnding" ItemsSource="{Binding ItemsInPricingSheet , Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Grid.Column="1" Grid.Row="1" Panel.ZIndex="-1" HorizontalAlignment="Center" AutoGenerateColumns="False"> 
     <DataGrid.Columns> 
      <DataGridTextColumn Header="סה''כ מחיר" Binding="{Binding TotalPrice, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/> 
      <DataGridTextColumn Header="כמות" Binding="{Binding Quantity, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/> 
      <DataGridTextColumn Header="שם פריט" IsReadOnly="True" Binding="{Binding ItemID, Mode=TwoWay, Converter={StaticResource ItemIDToItemName}}"/> 
      <DataGridTextColumn Header="שם קבוצה" IsReadOnly="True" Binding="{Binding GroupID, Mode=TwoWay, Converter={StaticResource GroupIDToGroupName}}"/> 
     </DataGrid.Columns> 
    </DataGrid> 

mein CellEditEnding Veranstaltung hier:

private void itemsInSheet_CellEditEnding(object sender, DataGridCellEditEndingEventArgs e) 
    { 
     if (e.EditAction == DataGridEditAction.Commit) 
     { 
      var column = e.Column as DataGridBoundColumn; 
      if (column != null) 
      {      
       var bindingPath = (column.Binding as Binding).Path.Path; 
       if (bindingPath == "Quantity") 
       {      
        int rowIndex = e.Row.GetIndex(); 
        var el = e.EditingElement as TextBox; 
        m_engine.UpdateTotalPrice(rowIndex); 

       } 
      } 
     } 
    } 

Und hier ist die UpdateTotalPrice (vorerst ich es einfach halten und der Gesamtpreis gleich der Anzahl):

internal void UpdateTotalPrice(int rowIndex) 
    { 
     sp_GetItemsInPricingSheets_Result data = m_PricingSheetManagerViewModel.ItemsInPricingSheet.ElementAt(rowIndex); 
     data.TotalPrice = (decimal)data.Quantity; 
    } 

ZUSÄTZLICHE INFORMATIONEN: Hier ist das Viewmodel, das ich verwende:

public class PricingSheetManagerViewModel : INotifyPropertyChanged 
{ 
    private ObservableCollection<sp_GetGroups_Result> m_groups; 
    public ObservableCollection<sp_GetGroups_Result> Groups 
    { 
     get { return m_groups; } 
     set 
     { 
      m_groups = value; 
      NotifyPropertyChanged("Groups"); 
     } 
    } 

    private ObservableCollection<sp_GetItems_Result> m_items; 
    public ObservableCollection<sp_GetItems_Result> Items 
    { 
     get { return m_items; } 
     set 
     { 
      m_items = value; 
      NotifyPropertyChanged("Items"); 
     } 
    } 

    private ObservableCollection<sp_GetItemsInPricingSheets_Result> m_itemsInPricingSheet; 
    public ObservableCollection<sp_GetItemsInPricingSheets_Result> ItemsInPricingSheet 
    { 
     get { return m_itemsInPricingSheet; } 
     set 
     { 
      m_itemsInPricingSheet = value; 
      NotifyPropertyChanged("ItemsInPricingSheet"); 
     } 
    } 

    private sp_GetPricingSheets_Result m_pricingSheet = new sp_GetPricingSheets_Result(); 
    public sp_GetPricingSheets_Result PricingSheet 
    { 
     get { return m_pricingSheet; } 
     set 
     { 
      m_pricingSheet = value; 
      NotifyPropertyChanged("PricingSheet"); 
     } 
    } 

    #region "PropertyChanged Event" 
    public event PropertyChangedEventHandler PropertyChanged; 

    private void NotifyPropertyChanged(string propertyName) 
    { 
     PropertyChangedEventHandler handler = PropertyChanged; 
     if (handler != null) 
     { 
      handler(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
    #endregion 
} 
+0

Können Sie die Quantity UpdateSourceTrigger zu LostFocus ändern? Wenn ja, können Sie dies in Quantity Property Setter tun. Setzen Sie den Gesamtpreis dort auf einen neuen Wert. Sie benötigen diese Methoden überhaupt nicht. Sie können dies in Ihrem ViewModel tun. – Yevgeniy

+0

wie kann ich es tun? Die Logik des Gesamtpreises ist nicht in der Ansicht (ich gab ein einfaches Beispiel für die Einstellung des Gesamtpreises, der neue Gesamtpreis beinhaltet Multiplikationen und andere logische Operationen, so Einstellung Wert in Xaml wird nicht funktionieren für mich) – user7925257

+0

Könnten Sie bitte Ihre Post ViewModel-Klasse (Wo TotalPrice- und Quantity-Eigenschaften gespeichert sind.)? – Yevgeniy

Antwort

0

ich es geschafft, das Element zu sehen, nachdem ich es von Fokus aktualisieren setzen das Datenraster, die aktuelle Zelle auf die erforderliche Zelle und beginnen gesetzt bearbeiten das i in der itemsInSheet_CellEditEnding Ereignis hier hinzugefügt ist der Code nach dem Update :

private void itemsInSheet_CellEditEnding(object sender, DataGridCellEditEndingEventArgs e) 
    { 
     if (e.EditAction == DataGridEditAction.Commit) 
     { 
      var column = e.Column as DataGridBoundColumn; 
      if (column != null) 
      {      
       var bindingPath = (column.Binding as Binding).Path.Path; 
       if (bindingPath == "Quantity") 
       {      
        int rowIndex = e.Row.GetIndex(); 
        var el = e.EditingElement as TextBox; 
        m_engine.UpdateTotalPrice(rowIndex); 
        itemsInSheet.Focus(); 
        itemsInSheet.CurrentCell = new DataGridCellInfo(itemsInSheet.Items[rowIndex], itemsInSheet.Columns[0]); 
        itemsInSheet.BeginEdit();     
       } 
      } 
     } 
    } 
Verwandte Themen