WPF DataGrid 计算总计列
WPF DataGrid calculated Total column
我有一个 DataGrid 可以为销售屏幕输入项目 /price/Quantity,我需要一个小计列,价格 * 数量,我不知道当用户离开价格时如何计算小计列或数量列。这是我的 xaml
标题
<DataGrid ItemsSource="{Binding Path=Datos,Mode=TwoWay,NotifyOnSourceUpdated=True}"
SelectedItem="{Binding Dato,Mode=TwoWay,NotifyOnSourceUpdated=True}"
AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn Header="Description" Binding="{ Binding Path=Descripcion}"></DataGridTextColumn>
<DataGridTextColumn Header="Price" Binding="{ Binding Path=Precio,UpdateSourceTrigger=PropertyChanged}" ></DataGridTextColumn>
<DataGridTextColumn Header="Quantity" Binding="{ Binding Path=Cant,UpdateSourceTrigger=PropertyChanged}"></DataGridTextColumn>
<DataGridTextColumn Header="Total" Binding="{ Binding Path=Total,UpdateSourceTrigger=PropertyChanged}"></DataGridTextColumn>
</DataGrid.Columns>
</DataGrid>
我的 ViewModel 是这样的:
public class VM : VMBase
{
public VM()
{
Datos.Add(new CDato() { Descripcion = "item 1", Precio = 2.5m, Cant = 3m, Total = 7.5m });
Datos.Add(new CDato() { Descripcion = "item 2", Precio = 5m, Cant = 2m, Total = 10m });
}
private ObservableCollection<CDato> _datos;
public ObservableCollection<CDato> Datos
{
get
{
if (_datos == null)
_datos = new ObservableCollection<CDato>();
return _datos;
}
set
{
_datos = value;
RaisePropertyChanged();
}
}
public void Calcular()
{
if (Dato != null)
{
Dato.Total = Dato.Precio * Dato.Cant;
RaisePropertyChanged("Dato");
RaisePropertyChanged("Datos");
}
}
private CDato dato;
public CDato Dato
{
get { return dato; }
set
{
dato = value;
RaisePropertyChanged();
}
}
}
public class CDato
{
public string Descripcion { get; set; }
public decimal Precio { get; set; }
public decimal Cant { get; set; }
public decimal Total { get; set; }
}
当用户更改单元格 "Precio"(价格)或 "Cant"(数量)时,必须使用此公式计算 "Total" 列 Tota = Precio * Cant
我找不到关于此的样本。
你能帮我解决这个问题吗?
非常感谢
您可以通过在道具中添加 RaisePropertyChanged( "Total" )
来创建它,用于计算 Total
属性。我创建了一些示例来解释如何操作。
<DataGrid ItemsSource="{Binding Objects}" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn Width="100" Binding="{Binding Price, UpdateSourceTrigger=PropertyChanged}" />
<DataGridTextColumn Width="100" Binding="{Binding Total}" />
</DataGrid.Columns>
</DataGrid>
还有 viewModel 道具。
private int _price;
public int Price
{
get { return _price; }
set { _price = value; RaisePropertyChanged( "Price" ); RaisePropertyChanged( "Total" ); }
}
public int Total
{
get { return _price * 2; }
}
更新
根据评论。有必要为 CDato
class(或从 VMBase
派生)实现 NotifyPropertyChanged
并为其道具添加 RaisePropertyChanged
。
我有一个 DataGrid 可以为销售屏幕输入项目 /price/Quantity,我需要一个小计列,价格 * 数量,我不知道当用户离开价格时如何计算小计列或数量列。这是我的 xaml
标题
<DataGrid ItemsSource="{Binding Path=Datos,Mode=TwoWay,NotifyOnSourceUpdated=True}"
SelectedItem="{Binding Dato,Mode=TwoWay,NotifyOnSourceUpdated=True}"
AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn Header="Description" Binding="{ Binding Path=Descripcion}"></DataGridTextColumn>
<DataGridTextColumn Header="Price" Binding="{ Binding Path=Precio,UpdateSourceTrigger=PropertyChanged}" ></DataGridTextColumn>
<DataGridTextColumn Header="Quantity" Binding="{ Binding Path=Cant,UpdateSourceTrigger=PropertyChanged}"></DataGridTextColumn>
<DataGridTextColumn Header="Total" Binding="{ Binding Path=Total,UpdateSourceTrigger=PropertyChanged}"></DataGridTextColumn>
</DataGrid.Columns>
</DataGrid>
我的 ViewModel 是这样的:
public class VM : VMBase
{
public VM()
{
Datos.Add(new CDato() { Descripcion = "item 1", Precio = 2.5m, Cant = 3m, Total = 7.5m });
Datos.Add(new CDato() { Descripcion = "item 2", Precio = 5m, Cant = 2m, Total = 10m });
}
private ObservableCollection<CDato> _datos;
public ObservableCollection<CDato> Datos
{
get
{
if (_datos == null)
_datos = new ObservableCollection<CDato>();
return _datos;
}
set
{
_datos = value;
RaisePropertyChanged();
}
}
public void Calcular()
{
if (Dato != null)
{
Dato.Total = Dato.Precio * Dato.Cant;
RaisePropertyChanged("Dato");
RaisePropertyChanged("Datos");
}
}
private CDato dato;
public CDato Dato
{
get { return dato; }
set
{
dato = value;
RaisePropertyChanged();
}
}
}
public class CDato
{
public string Descripcion { get; set; }
public decimal Precio { get; set; }
public decimal Cant { get; set; }
public decimal Total { get; set; }
}
当用户更改单元格 "Precio"(价格)或 "Cant"(数量)时,必须使用此公式计算 "Total" 列 Tota = Precio * Cant
我找不到关于此的样本。
你能帮我解决这个问题吗?
非常感谢
您可以通过在道具中添加 RaisePropertyChanged( "Total" )
来创建它,用于计算 Total
属性。我创建了一些示例来解释如何操作。
<DataGrid ItemsSource="{Binding Objects}" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn Width="100" Binding="{Binding Price, UpdateSourceTrigger=PropertyChanged}" />
<DataGridTextColumn Width="100" Binding="{Binding Total}" />
</DataGrid.Columns>
</DataGrid>
还有 viewModel 道具。
private int _price;
public int Price
{
get { return _price; }
set { _price = value; RaisePropertyChanged( "Price" ); RaisePropertyChanged( "Total" ); }
}
public int Total
{
get { return _price * 2; }
}
更新
根据评论。有必要为 CDato
class(或从 VMBase
派生)实现 NotifyPropertyChanged
并为其道具添加 RaisePropertyChanged
。