[英]How to I respond to changed cells in the CodePlex WPF DataGrid?
[英]How to Update Total summary when WPF DataGrid cells are changed?
我有一個匯總表。 當輸入新行時,它們將更新。 但是,我希望它們隨着新行或現有行中單元格的更改而更新。 我閱讀了幾篇文章,並確定處理單元更改事件,然后在網格上運行UpdateTotalSummary方法可以解決問題,但事實並非如此。 以下是我正在使用的代碼,並且我驗證了通過調試找到的代碼。 任何幫助表示贊賞:
<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 { };
}
當您編輯單元格時,ItemsSource不會更新。 這就是為什么TextBox綁定不起作用的原因。 將TotalAmount屬性和Update方法添加到WindowxViewModel
:
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方法傳遞給TrsFundDocItem:
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}" />
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.