我在WPF和实体框架中显示dataGrid,第2列有单位价格,第3列有数量(第4栏有折扣),我希望第5栏是汇总。我的问题是如何捕获第三列并计算对总列的更改。
这是代码,如何显示数据
<DataGrid.Columns>
<DataGridComboBoxColumn x:Name="ddd" Header="Expenses" Width="*" SelectedValueBinding="{Binding Path=ExpensesId}" DisplayMemberPath="ExpensesName" SelectedValuePath="ExpensesTypeId"/>
<DataGridTextColumn Header="price" Width="*" Binding="{Binding Path=Expenses.PricePorEach}"/>
<DataGridTextColumn Header="quantity" Width="50" Binding="{Binding Path=Quantity}"/>
<DataGridTextColumn Header="discount" Width="*" Binding="{Binding Path=Discount}"/>
<DataGridTextColumn Header="Total" Width="*" Binding="{Binding Path=Total}"/>
</DataGrid.Columns>
</DataGrid>
ContractorEntities ce = new ContractorEntities();
public MainWindow()
{
InitializeComponent();
BindData();
}
private void BindData()
{
var dataSource = new ObservableCollection<Jobs>(ce.Jobs);
dataSource.CollectionChanged += CollectionChanged;
dg.ItemsSource = dataSource;
dg.DataContext = dataSource;
}
private void CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
if (e.Action == NotifyCollectionChangedAction.Add)
foreach (Jobs job in e.NewItems)
ce.Jobs.Add(job);
else if (e.Action == NotifyCollectionChangedAction.Remove)
foreach (Jobs jobin e.OldItems)
ce.Jobs.Remove(job);
}
private void saveButton_Click(object sender, RoutedEventArgs e)
{
ce.SaveChanges();
}
[NotMapped]
public decimal? Total
{
get
{
return (Price * Quantity) - Discount;
}
set { }
}
public void OnDiscountChanged()
{
base.OnPropertyChanged("Total");//This line is not known
}
public void OnPriceChanged()
{
base.OnPropertyChanged("Total");//This line is not known
}
public void OnQuantityChanged()
{
base.OnPropertyChanged("Total");//This line is not known
}
}我试过几种方法,但没有结果
预先感谢您的帮助
发布于 2013-05-22 14:03:15
如果使用CodeFirst创建实体
由于使用的是实体,因此可以在实体类中创建未映射(使用[NotMapped]属性)属性,该属性计算值并将列绑定到该属性。由于实体类默认实现INotifyPropertyChanged,所以所有操作都应该执行,而不需要做更多的工作,尽管您可能需要对其他三个(价格、数量、折扣)进行PropertyChangedEventHandler调用,以告诉UI更新Total的值。
[NotMapped]
public int Total
{
get
{
return (Price * Quantity) - Discount;
{
}因为您不会在代码中设置总计,所以属性是ReadOnly。
如果使用EDMX和designer创建实体
由于您使用的是EDMX (通过设计器),因此需要通过部分类添加属性。
base.OnPropertyChanged("Total");),以便UI知道要更新。
公共部分类作业{公共空OnDiscountChanged() {base.OnPropertyChanged(“总计”);}公共空OnPriceChanged() {base.OnPropertyChanged(“总计”);}公共空OnQuantityChanged() {base.OnPropertyChanged(“总计”);}}更新
我找到了你的解决方案,然后看了看。您的实体通过T4模板生成。我在这些方面的经验不多,但大部分情况下,“如果您使用EDMX和设计器来创建实体”一节中的答案仍然适用。您需要修改T4模板,以实现属性更改通知,例如可以访问属性更改方法,并将Total (没有NotMapped属性)放在部分类中。答案supplied here看起来是相关的和正确的(基于我对这个主题的了解)。
https://stackoverflow.com/questions/16693644
复制相似问题