首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >具有实体的wpf dataGrid和单元

具有实体的wpf dataGrid和单元
EN

Stack Overflow用户
提问于 2013-05-22 13:53:33
回答 1查看 764关注 0票数 0

我在WPF和实体框架中显示dataGrid,第2列有单位价格,第3列有数量(第4栏有折扣),我希望第5栏是汇总。我的问题是如何捕获第三列并计算对总列的更改。

这是代码,如何显示数据

代码语言:javascript
复制
          <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
    }

}

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

预先感谢您的帮助

EN

回答 1

Stack Overflow用户

发布于 2013-05-22 14:03:15

如果使用CodeFirst创建实体

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

代码语言:javascript
复制
[NotMapped]
public int Total
{
    get
    {
        return (Price * Quantity) - Discount;
    {
}

因为您不会在代码中设置总计,所以属性是ReadOnly。

如果使用EDMX和designer创建实体

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

  1. 创建一个与您想要修改的实体相同的新类(在本例中,我认为是作业)。
  2. 将类声明标记为分部。在这种情况下,现在可以将方法添加到生成的类中。
  3. 添加上述“总计”属性(根据需要编辑公式)。
  4. 您可能必须重写PriceChanged、QuantityChanged和DiscountChanged方法,并添加一个属性更改事件处理程序调用,指定总属性(例如base.OnPropertyChanged("Total");),以便UI知道要更新。 公共部分类作业{公共空OnDiscountChanged() {base.OnPropertyChanged(“总计”);}公共空OnPriceChanged() {base.OnPropertyChanged(“总计”);}公共空OnQuantityChanged() {base.OnPropertyChanged(“总计”);}}

更新

我找到了你的解决方案,然后看了看。您的实体通过T4模板生成。我在这些方面的经验不多,但大部分情况下,“如果您使用EDMX和设计器来创建实体”一节中的答案仍然适用。您需要修改T4模板,以实现属性更改通知,例如可以访问属性更改方法,并将Total (没有NotMapped属性)放在部分类中。答案supplied here看起来是相关的和正确的(基于我对这个主题的了解)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16693644

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档