我在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
}
}
我尝试了几种方法,但没有结果
提前感谢您的帮助
答案 0 :(得分:1)
由于您正在使用实体,因此可以在实体类中创建未映射(使用[NotMapped]
属性)属性,该属性计算值并将列绑定到该属性。由于Entity类默认实现INotifyPropertyChanged,所以一切都应该执行而不需要做太多工作,尽管您可能需要对其他三个(价格,数量,折扣)进行PropertyChangedEventHandler调用,以告知UI更新Total的值。
[NotMapped]
public int Total
{
get
{
return (Price * Quantity) - Discount;
{
}
由于您不打算在代码中设置Total,因此该属性为ReadOnly。
由于您使用EDMX(通过设计器),您需要通过部分类添加属性。
您可能必须覆盖PriceChanged,QuantityChanged和DiscountChanged方法,并添加属性更改事件处理程序调用,指定总属性(例如base.OnPropertyChanged("Total");
),以便UI知道更新。
public partial class Job
{
public void OnDiscountChanged()
{
base.OnPropertyChanged("Total");
}
public void OnPriceChanged()
{
base.OnPropertyChanged("Total");
}
public void OnQuantityChanged()
{
base.OnPropertyChanged("Total");
}
}
我得到了你的解决方案,然后看了看。您的实体是通过T4模板生成的。我对这些经验并不多,但在大多数情况下,“如果您正在使用EDMX和设计师来创建实体”部分中的答案仍然适用。您需要修改T4模板以实现属性更改通知,例如您可以获取属性更改方法,并将Total属性(不包含NotMapped属性)放入您的分部类中。答案supplied here看起来是相关和正确的(基于我对该主题的了解)。