2017-05-16 14 views
0

私は合計サマリーを持つグリッドを持っています。新しい行が入力されたときに更新されます。しかし、新しい行や既存の行でセルが変更されると、それらを更新したい。私はいくつかの記事を読んで、セルの変更イベントを処理し、グリッド上でUpdateTotalSummaryメソッドを実行するとそのトリックが実行されると判断しましたが、そうではありません。以下は私が使用しているコードで、コードがデバッグによってヒットしていることを確認しました。すべてのヘルプは大歓迎です。更新方法WPF DataGridセルが変更されたときの合計サマリー?

<Grid DataContext="{Binding Source={StaticResource VM}}"> 
    <Grid.Resources> 
     <local:TotalSumConverter x:Key="sumConverter" /> 
    </Grid.Resources> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="*"/> 
     <RowDefinition Height="auto"/> 
    </Grid.RowDefinitions> 
    <DataGrid x:Name="myGrid" AutoGenerateColumns="False" ItemsSource="{Binding TrsFundDocItems,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"> 
     <DataGrid.Columns> 
      <DataGridTextColumn Binding="{Binding Amount,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" Header="Amount"/> 
      <DataGridTextColumn Binding="{Binding FCAmount,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" Header="FCAmount"/> 
     </DataGrid.Columns> 
    </DataGrid> 
    <Grid Grid.RowSpan="2"> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="*"/> 
      <RowDefinition Height="auto"/> 
     </Grid.RowDefinitions> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition /> 
      <ColumnDefinition Width="auto"/> 
     </Grid.ColumnDefinitions> 
     <Grid Grid.Row="1" Grid.Column="1" Margin="8"> 
      <Grid.RowDefinitions> 
       <RowDefinition/> 
       <RowDefinition/> 
      </Grid.RowDefinitions> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="auto"/> 
       <ColumnDefinition Width="auto"/> 
       <ColumnDefinition Width="auto"/> 
      </Grid.ColumnDefinitions> 
      <TextBlock Text="SumTotal :" Grid.Row="0" Grid.Column="0"/> 


      <TextBox Grid.Row="0" Grid.Column="1" Text="{Binding ItemsSource, ConverterParameter=Amount, Converter={StaticResource sumConverter}, ElementName=myGrid, FallbackValue=0, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" /> 

     </Grid> 
    </Grid> 
    </Grid> 

は、これは私のビューモデルである:

public class WindowxViewModel : INotifyPropertyChanged 
{ 
    public WindowxViewModel() 
    { 
     TrsFundDocItems = new ObservableCollection<TrsFundDocItem> { new TrsFundDocItem { Amount = 10, FCAmount = 1 }, new TrsFundDocItem { Amount = 5, FCAmount = 8 } }; 
    } 


    private ObservableCollection<TrsFundDocItem> _TrsFundDocItems; 

    public ObservableCollection<TrsFundDocItem> TrsFundDocItems 
    { 
     get { return _TrsFundDocItems; } 
     set 
     { 
      if (_TrsFundDocItems == value) return; 
      _TrsFundDocItems = value; 
      PropertyChanged(this, new PropertyChangedEventArgs(nameof(TrsFundDocItems))); 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged = delegate { }; 
} 

コンバータ:

//////////////// 
    public class TotalSumConverter : IValueConverter 
    { 
     public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
     { 
      var users = value as IEnumerable<object>; 
      if (users == null) 
       return "$0.00"; 

      double sum = 0; 

      foreach (var u in users) 
      { 
       sum += ((TrsFundDocItem)u).Amount; 
      } 


      return sum.ToString("c"); 
     } 

     public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
     { 
      return 0; 
     } 
    } 

エンティティ:編集時に

public class TrsFundDocItem:INotifyPropertyChanged 
    { 
     //public double Amount { get; set; } 
     private double amount; 

     public double Amount 
     { 
      get { return amount; } 
      set { 
       if (amount == value) return; 
       amount = value; 
       PropertyChanged(this, new PropertyChangedEventArgs(nameof(Amount))); 
      } 
     } 

     public double FCAmount { get; set; } 

     public event PropertyChangedEventHandler PropertyChanged=delegate { }; 
    } 
+1

任意の値が変更された場合。合計の合計は何に設定されていますか?ちょうど私たちの行動を説明してください。同様の値はまったく変化しないか、他の値に変更されます –

+0

私は総要約のグリッドを持っています。新しい行が入力されたときに更新されます。しかし、私は、セルが新しい行または既存の行で変更されたときにそれらを更新したい –

答えて

2

のItemsSourceは更新されません細胞。そのため、TextBoxバインディングは機能しません。 はWindowxViewModelにTotalAmountプロパティとUpdateメソッドを追加します。TrsFundDocItemへ

public string TotalAmount 
    { 
     get { return _totalAmount; } 
     set 
     { 
      if (_totalAmount == value) return; 
      _totalAmount = value; 
      PropertyChanged(this, new PropertyChangedEventArgs(nameof(TotalAmount))); 
     } 
    } 

    private void UpdateAmount() 
    { 
     double sum = 0; 

     foreach (var u in TrsFundDocItems) 
     { 
      sum += u.Amount; 
     } 


     TotalAmount = sum.ToString("c"); 
    } 

パスUpdateAmount方法:

public class TrsFundDocItem : INotifyPropertyChanged 
{ 
    private readonly Action _updateAction; 

    //public double Amount { get; set; } 
    private double amount; 

    public TrsFundDocItem(Action updateAction) 
    { 
     _updateAction = updateAction; 
    } 
    public double Amount 
    { 
     get { return amount; } 
     set 
     { 
      if (amount == value) return; 
      amount = value; 
      PropertyChanged(this, new PropertyChangedEventArgs(nameof(Amount))); 
      _updateAction(); 
     } 
    } 

    public double FCAmount { get; set; } 

    public event PropertyChangedEventHandler PropertyChanged = delegate { }; 
} 

更新バインディング:

<TextBox Grid.Row="0" Grid.Column="1" Text="{Binding TotalAmount, FallbackValue=0, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" /> 
関連する問題