2017-05-21 1 views
0

Je travaille sur le projet.J'utilise DataGrid pour remplir la "Collection Observable" vide et il fonctionne comme prévu.Le problème principal est que je veux calculer "Prix total" de le "produit" quand j'entre dans la vue de grille de données. Comme le "Pricesrc" est lié à une zone de texte qui doit afficher "le prix total" .Maintenant comment j'accomplis cette tâche. Aide sera appréciée.Collection observable additionner la colonne comme ligne ajoutée WPF

C'est ma classe de produits.

public class product_data 
{ 
    private String _Name; 
    private String _Brand; 
    private String _Price; 

    public string Name 
    { 
     get { return _Name; } 
     set { _Name = value; } 
    } 

    public string Brand 
    { 
     get { return _Brand; } 
     set { _Brand = value; } 
    } 

    public string Price 
    { 
     get { return _Price; } 
     set 
     { 
      _Price = value; 
     } 
    } 
} 

Ceci est ma classe ViewModel.

public class ViewModel:INotifyPropertyChanged 
{ 


    public int Pricesrc 
    { 
     set;get; 
    } 
    public ObservableCollection<product_data> listsrc; 
    public ObservableCollection<product_data> product_data 
    { 
     get { return listsrc; } 
     set 
     { 
      listsrc = value; 
     } 
    } 
    public ViewModel() 
    { 
     listsrc = new ObservableCollection<Pages.Product.product_data>(); 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    public void onPropertyChanged(string prop) 
    { 
     PropertyChanged?.Invoke(this,new PropertyChangedEventArgs(prop)); 
    } 
} 

Ceci est mon XAML:

<Grid Background="#C82C2C2C"> 
    <StackPanel Orientation="Vertical" Background="LightGray" Margin="150,60,150,60"> 
     <StackPanel.Effect> 
      <DropShadowEffect BlurRadius="44"/> 
     </StackPanel.Effect> 
     <StackPanel Background="#FF886AF0" Height="80"> 
      <TextBlock Text="Bill" FontSize="25" FontWeight="SemiBold" HorizontalAlignment="Center" Margin="0,20,0,0" Foreground="#FFE6E6E6"></TextBlock> 
     </StackPanel> 
     <StackPanel Orientation="Horizontal" HorizontalAlignment="Center" Margin="0,35,0,0"> 
      <TextBox x:Name="txt_Total" ToolTip="Total" Text="{Binding Pricesrc}" Height="50" Background="White" Foreground="#FFB6B2B2" BorderBrush="{x:Null}" BorderThickness="3" HorizontalAlignment="Center" Width="630" FontWeight="DemiBold" FontSize="16" VerticalContentAlignment="Center" Style="{DynamicResource flat_ui_textbox}" GotFocus="textboxes_gotFocus" LostFocus="textboxes_lostFocus"/> 
     </StackPanel> 
     <StackPanel Orientation="Horizontal" HorizontalAlignment="Center" > 
      <TextBox x:Name="txt_advance" ToolTip="Advance" Text="Advance" Height="50" Background="White" Foreground="#FFB6B2B2" BorderBrush="{x:Null}" BorderThickness="3" HorizontalAlignment="Center" Width="315" FontWeight="DemiBold" FontSize="16" VerticalContentAlignment="Center" Style="{DynamicResource flat_ui_textbox}" GotFocus="textboxes_gotFocus" LostFocus="textboxes_lostFocus"/> 
      <TextBox x:Name="txt_pending" ToolTip="Pending" Text="Pending" Height="50" Background="White" Foreground="#FFB6B2B2" BorderBrush="{x:Null}" BorderThickness="3" HorizontalAlignment="Center" Width="315" FontWeight="DemiBold" FontSize="16" VerticalContentAlignment="Center" Style="{DynamicResource flat_ui_textbox}" GotFocus="textboxes_gotFocus" LostFocus="textboxes_lostFocus"/> 
     </StackPanel> 
     <StackPanel Orientation="Horizontal" HorizontalAlignment="Center" > 
      <TextBox x:Name="txt_date" ToolTip="Date" Text="Date" Height="50" Background="White" Foreground="#FFB6B2B2" BorderBrush="{x:Null}" BorderThickness="3" HorizontalAlignment="Center" Width="475" FontWeight="DemiBold" FontSize="16" VerticalContentAlignment="Center" Style="{DynamicResource flat_ui_textbox}" GotFocus="textboxes_gotFocus" LostFocus="textboxes_lostFocus"/> 
      <TextBlock Margin="48,0,0,0" Text="Is Paid" VerticalAlignment="Center" FontWeight="Bold" FontSize="18" Foreground="#FF818181"/> 
      <CheckBox Margin="16,0,0,0" Height="35" Width="35" BorderBrush="{x:Null}" Style="{DynamicResource flat_ui_checkboxes}"></CheckBox> 
     </StackPanel> 
     <GroupBox Header="Product" Margin="150,35,150,0" Foreground="#FF7E7E7E" FontSize="24" FontWeight="DemiBold"> 
      <DataGrid x:Name="product_grid" ItemsSource="{Binding product_data,Mode=TwoWay}" HorizontalAlignment="Center" Margin="0,0,0,0" Height=" 350" Background="White" Width="973.5" AutoGenerateColumns="False" CanUserAddRows="True"> 
       <DataGrid.Columns> 
        <DataGridTextColumn Header="Name" Binding="{Binding Name,Mode=TwoWay}" ></DataGridTextColumn> 
        <DataGridTextColumn Header="Brand" Binding="{Binding Brand,Mode=TwoWay}"></DataGridTextColumn> 
        <DataGridTextColumn Header="Price" Binding="{Binding Price,Mode=TwoWay}"></DataGridTextColumn> 
       </DataGrid.Columns> 
      </DataGrid> 
     </GroupBox> 
     <Button Width="200" Height="55" Background="#FF2DCC70" Margin="0,0,0,0" Template="{DynamicResource flat_add_green_btn}" Command="{Binding Add_Customer_Command}" Click="Button_Click" /> 
    </StackPanel> 
</Grid> 

Répondre

2

Tout d'abord, vous devez utiliser PropertyChanged événement lorsque vos Pricesrc changements:

private int _Pricesrc; 
public int Pricesrc 
{ 
    get { return _Pricesrc; } 
    set { _Pricesrc = value; onPropertyChanged(nameof(Pricesrc)); } 
} 

Cela est nécessaire si lorsque vous définissez la liaison totale est mis à jour.

Maintenant, afin de mettre à jour Pricesrc lorsque votre collection change (quand l'élément est ajouté ou supprimé) vous devez gérer l'événement de la collection qui informe exactement à ce sujet - CollectionChanged https://msdn.microsoft.com/en-us/library/ms653375(v=vs.110).aspx

dans le constructeur ajouter gestionnaire d'événements:

public ViewModel() 
{ 
    listsrc = new ObservableCollection<Pages.Product.product_data>(); 
    listsrc.CollectionChanged += OnCollectionChanged; 
} 

private void OnCollectionChanged(object sender, NotifyCollectionChangedEventArgs e) 
{ 
    Pricesrc = listsrc.Sum(prod => prod.Price); 
} 

Edit: Si vous voulez mettre à jour prix total lorsque le prix du produit existant est modifié, vous devez mettre en œuvre INotifyPropertyChanged dans votre classe product_data et événement relancer lorsque Price propriété est modifiée semblable à ce que je faisais ici Pricesrc propriété. Puis gérer cet événement et mettre à jour le prix total.

+0

Merci pour la réponse, Il résout le problème, mais une chose est laissée que "La dernière rangée de prix de la grille n'est pas ajouté .... une solution ?? ... et pouvez-vous expliquer ce que" Pricesrc = listsrc.Sum (prod => prod.Price) "vraiment faire ... Merci agai –

+0

Aussi quand je clique sur la colonne vide l'événement est déclenché mais il n'est pas déclenché quand la ligne est ajoutée –

+0

Oh, je n'ai pas vu que Price La propriété est une chaîne Vous devez la convertir en type numérique approprié (comme int ou double) lors de la sommation (ou changer complètement le type de propriété) Sum somme la valeur de la propriété donnée pour while IEnumerable (c'est-à-dire Liste, tableau etc.) . – Shadowed