WPF Entity Framework получает значение первых 2 ячеек таблицы данных, а затем изменяет значение третьей ячейки посредством привязки
Вот как выглядит мой Datagrid, я использую DataContext и CollectionViewSource для заполнения Grid.
Вот примеры кодов, которые я сделал, чтобы сделать это:
<CollectionViewSource x:Key="BeginningBalanceViewSource" d:DesignSource="{d:DesignInstance {x:Type reportModel:BeginningBalance}, CreateList=True}"/>
<DataGrid DataContext="{Binding Source={StaticResource BeginningBalanceViewSource}}" ItemsSource="{Binding Source={StaticResource BeginningBalanceViewSource}}">
<DataGrid.Columns>
<DataGridTemplateColumn Header="Denominations" MinWidth="130">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBox BorderThickness="0" IsReadOnly="True" Text="{Binding BBDenomination, Mode=TwoWay, UpdateSourceTrigger=Explicit}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="Pieces">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<controls:NumericUpDown BorderThickness="0" Minimum="0" Value="{Binding BBPieces, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="Amount" MinWidth="130">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBox BorderThickness="0" IsReadOnly="True" Text="{Binding BBAmount, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
Вот как я изменяю свой CollectionViewSource для обновления DataContext (который я получил из MSDN):
private CollectionViewSource _beginningBalanceViewSource;
private BeginningBalance _beginningBalance;
_beginningBalanceViewSource = ((CollectionViewSource)(FindResource("BeginningBalanceViewSource")))
_beginningBalance.Source = _entities.BeginningBalances.ToList().Where(x=>x.BBDateManaged.Equals(d)).ToList();
Я отредактировал тип сущности BeginningBalance.cs (который является ObservableCollection)
public partial class BeginningBalance : INotifyPropertyChanged
{
public int BBID { get; set; }
public double BBDenomination { get; set; }
private int pieces;
public int BBPieces { get { return pieces; }
set
{
pieces = value;
OnPropertyChanged("BBPieces");
OnPropertyChanged("BBAmount");
} }
public double BBAmount { get; set;}
//public double BBAmount { get{ return BBDenomination * BBPieces; } }
//sadly, it returns an error stating that The entity type BeginningBalance is not part of the model for the current context if I ever were to do this.
public System.DateTime BBDateManaged { get; set; }
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
var handler = PropertyChanged;
if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
}
}
Если вы заметили код, я добавил INotifyPropertyChanged, чтобы немного протестировать и посмотреть, изменится ли сумма (третий столбец DataGrid) (я знаю, что я делаю, вероятно, неправильно, пожалуйста, простите мою глупость, так как мне не хватает опыта в WPF)
Все работает нормально, единственная проблема, с которой я сталкиваюсь, это то, что мне нужно только знать, как получить значение первых двух ячеек таблицы данных, а затем изменить значение третьей ячейки с помощью привязки. Первые 2 ячейки будут умножены друг на друга, затем третья ячейка получит умноженное значение автоматически, как только я изменю значение 2-й ячейки. NumericUpDownColumn - единственный доступный только для чтения, и я попытался добавить событие, и да, это как-то работает (но это немного испортило мой способ кодирования).
Должен ли я также создать ViewModelClass для начального баланса? Если мне нужно, я не знаю, как сохранить изменения по нажатию кнопки, который мой:
_entities.SaveChanges();
который будет напрямую сохранять в базу данных.
Я посмотрю на шаблон MVVM после того, как решу эту проблему.
1 ответ
Хорошо, извините за то, что я идиот, это было так же просто, как просто изменить мой
public double BBAmount { get; set;}
в
public double BBAmount { get{ return BBDenomination * BBPieces; }
set { }
}
Я просто забыл добавить set{}
черт.