0

我在WPF和實體框架中顯示dataGrid,第2列有單價列3有數量(第4列有折扣),我想列5將是總結。我的問題是我怎麼能捕捉到第三列和計算的變化總列wpf dataGrid與實體的總計單元

這裏是代碼如何顯示

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

} 

我試過幾個方面的數據,但沒有結果

預先感謝幫助

回答

1

如果使用CodeFirst來創建實體

由於您使用的實體,您可以創建一條u在實體類中使用nmapped(使用[NotMapped]屬性)屬性來計算值並將列綁定到該屬性。由於實體類默認實現了INotifyPropertyChanged,因此您可能需要對其他三個(Price,Quantity,Discount)的PropertyChangedEventHandler調用通知用戶界面更新Total值,所有操作都應該不需要太多工作。

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

由於您不打算在代碼中設置總計,屬性爲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屬性)放入您的部分類中。答案supplied here看起來是相關的和正確的(基於我對該主題有什麼瞭解)。

+0

對不起,但我不明白我是怎麼做到的? – user1095549

+0

你如何生成你的實體?你在使用實體框架設計器嗎? – CodeWarrior

+0

是的,與設計師。辦法? – user1095549