0

Я отображаю данныеGrid в WPF и сущности Framework, столбец 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]) в вашем классе сущности, который вычисляет значения и связывает столбцы с этим свойством. Поскольку классы Entity реализуют INotifyPropertyChanged по умолчанию, все должно выполняться без дополнительной работы, хотя вам может потребоваться поместить вызов PropertyChangedEventHandler на другие три (Цена, Количество, Скидка), чтобы сообщить пользовательскому интерфейсу об обновлении значения Total.

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

Поскольку вы не собираетесь устанавливать код Total in, свойство ReadOnly.

Если вы используете EDMX и конструктор для создания объектов

Поскольку вы используете EDMX (через конструктор), вам нужно будет добавить свойство с помощью частичного класса.

  1. Создайте новый класс, названный так же, как и Entity, который вы хотите изменить (в этом случае я думаю).
  2. Отметьте объявление класса как частичное. В этом случае теперь вы можете добавлять методы к сгенерированному классу.
  3. Добавить выше Общее свойство (при необходимости отредактируйте формулу).
  4. Вероятно, вам придется переопределить методы PriceChanged, QuantityChanged и DiscountChanged и добавить связанный с изменением свойства обработчик обработчика событий, определяющий общее свойство (например, base.OnPropertyChanged("Total");), чтобы пользовательский интерфейс мог обновиться.

    public partial class Job 
    { 
        public void OnDiscountChanged() 
        { 
         base.OnPropertyChanged("Total"); 
        } 
    
        public void OnPriceChanged() 
        { 
         base.OnPropertyChanged("Total"); 
        } 
    
        public void OnQuantityChanged() 
        { 
         base.OnPropertyChanged("Total"); 
        } 
    } 
    

Update

Я получил ваше решение, и посмотрел на него. Ваши объекты создаются с помощью шаблона T4. У меня нет большого опыта работы с ними, но, по большей части, ответ выше в разделе «Если вы используете EDMX и конструктор для создания своих объектов», все равно применяется. Вам нужно изменить шаблон T4, чтобы реализовать измененные свойства свойства, таким образом, как вы можете перейти к методу с измененным свойством, и поместить свойство Total (без атрибута NotMapped) в ваш частичный класс. Ответ supplied here выглядит как релевантный и правильный (исходя из того, какие знания у меня есть о предмете).

+0

Извините, но я не понял, как я это делаю? – user1095549

+0

Как вы создаете свои сущности? Используете ли вы конструктор структуры Entity Framework? – CodeWarrior

+0

да, с дизайнером. путь? – user1095549

Смежные вопросы