2017-05-21 16 views
0

私はproject.Iで作業しています空の "Observable Collection"を埋めるためにDataGridを使用していて、それがexpected.the主な問題として働いています。 "Total Price"私がデータグリッドビューに入力するとき "製品"。 "Pricesrc"は、 "総価格"を表示する必要があるテキストボックスにバインドされています。今どのように私はこのタスクを達成する。ヘルプは高く評価されます。Observable Collection行を追加して列を合計します。WPF

Thは私の製品クラスです。

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; 
     } 
    } 
} 

これは私の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)); 
    } 
} 

これは私の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> 

答えて

2

まずあなたPricesrc変更するときにPropertyChangedイベントを使用する必要があります:あなたはバインディング合計が更新された設定時に

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

はこれがとても必要とされます。

さて、Pricesrcを更新するためにあなたのコレクションの変更は、(アイテムが追加または削除された)あなたはそれについて正確に通知し、コレクションのイベントを処理する必要があります - イベントハンドラを追加コンストラクタでhttps://msdn.microsoft.com/en-us/library/ms653375(v=vs.110).aspx

をて、CollectionChanged:

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); 
} 

編集:あなたは、既存の製品の価格が変更されたときに合計金額を更新したい場合は、あなたのproduct_dataクラスにINotifyPropertyChangedのを実装する必要がありますし、Priceプロパティは、同様の変更されたとき、私は0123で、ここで何をしたかにイベントを発生させますプロパティ。その後、そのイベントを処理し、総価格を更新します。

+0

回答をお寄せいただきありがとうございますが、問題が解決しましたが、「グリッドの価格の最後の行は追加されていません....どんな解決策ですか?」そして「Pricesrc = listsrc.Sum prod => prod.Price) "本当に...ありがとうございます。 –

+0

また、空の列をクリックすると、イベントがトリガーされますが、行が追加されたときにトリガーされません。 –

+0

あの、 合計は、基本的に与えられたプロパティの値を合計します。ただし、IEnumerable (つまり、リスト、配列など)の場合は、その値は文字列であるため、文字列の場合はintまたはdoubleなどの適切な数値型に変換してください。 。 – Shadowed

関連する問題