0

我在 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
    }

}

我尝试了几种方法,但没有结果

提前感谢您的帮助

4

1 回答 1

1

如果您使用 CodeFirst 创建实体

由于您使用的是实体,因此您可以[NotMapped]在计算值并将列绑定到该属性的实体类中创建一个未映射的(使用属性)属性。由于 Entity 类默认实现 INotifyPropertyChanged,所以一切都应该执行而无需更多工作,尽管您可能需要在其他三个(价格、数量、折扣)上调用 PropertyChangedEventHandler 来告诉 UI 更新 Total 的值。

[NotMapped]
public int Total
{
    get
    {
        return (Price * Quantity) - Discount;
    {
}

由于您不会在代码中设置 Total,因此该属性为 ReadOnly。

如果您使用 EDMX 和设计器来创建实体

由于您使用的是 EDMX(通过设计器),因此您需要通过部分类添加属性。

  1. 创建一个与您要修改的实体名称相同的新类(我认为在这种情况下为作业)。
  2. 将类声明标记为部分。在这种情况下,您现在可以向生成的类添加方法。
  3. 添加上面的 Total 属性(根据需要编辑公式)。
  4. 您可能必须重写 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 属性)放在您的部分类中。此处提供的答案看起来是相关且正确的(基于我对该主题的了解)。

于 2013-05-22T14:03:15.323 回答