【发布时间】:2018-01-19 15:59:21
【问题描述】:
我有一个数据网格、一个 ViewModel 中产品类型的 ObservableCollection 和一个 EventToCommand 的实现,如下所示。 我想从 Quantity 和 Cost Column 的乘积中更新 Total Column 并保存更改,而不使用背后的恶意代码或 Windows Forms DataGridView。 我怎样才能做到这一点? 数据网格:
<DataGrid x:Name="dataGrid" Margin="5,5,10,5" AutoGenerateColumns="False" HorizontalAlignment="Stretch" ItemsSource="{Binding ProductList, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" VerticalAlignment="Stretch" Height="566" >
<i:Interaction.Triggers>
<i:EventTrigger EventName="CellEditEnding" SourceObject="{Binding ElementName=Control}">
<cmd:EventToCommand Command="{Binding EndEdit}" PassEventArgsToCommand="True"/>
</i:EventTrigger>
</i:Interaction.Triggers>
<DataGrid.Columns>
<DataGridTextColumn x:Name="Id" Binding="{Binding Path=Id, Mode=TwoWay}" Header="Id"/>
<DataGridTextColumn x:Name="name" Binding="{Binding Path=Name, Mode=TwoWay}" Header="Name"/>
<DataGridTextColumn x:Name="cost" Binding="{Binding Path=Cost, Mode=TwoWay}" Header="Cost"/>
<DataGridTextColumn x:Name="Quantity" Binding="{Binding Path=Quantity, Mode=TwoWay}" Header="Quantity"/>
<DataGridTextColumn x:Name="total" Binding="{Binding Path=Total, Mode=TwoWay}" Header="Total"/>
</DataGrid.Columns>
然后在 ViewModel 中
private ObservableCollection<Product> _product;
public ObservableCollection<Product> MyProduct
{
get
{
return _product;
}
set
{
Set(ref _product, value);
}
}
public ProductViewModel(IDataService proxy)
{
_proxy = proxy;
LoadCommand = new RelayCommand(DoGetProducts);
EndEdit = new RelayCommand<DataGridCellEditEndingEventArgs>(DoEndEdit);
}
private void DoEndEdit(DataGridCellEditEndingEventArgs obj)
{
DataGridRow row = obj.Row;
Product p = (Product)row.Item;
p.Total = p.Cost*p.Quantity;
_proxy.SaveAll();
}
然后在模型中:
public class DataService : IDataService
{
ProductEntities context;
public DataService()
{
context = new ProductEntities();
}
public ObservableCollection<Product> GetProducts(){
ObservableCollection<Product> products = new ObservableCollection<Product>();
foreach(var p in context.Products.Tolist()){
products.add(p);
}
return products;
}
public void SaveAll()
{
context.SaveChanges();
}
}
当成本和数量发生变化时,数据网格正在加载产品但不更新总计。另外,不保存数据库中的更改
【问题讨论】:
-
如果您的模型 Total setter 正在实现 INotifyPropertChanged 接口(未显示),那么我能想到的唯一建议是将 UpdateSourceTrigger=PropertyChanged 添加到您的绑定中。
-
当 ViewModel 中没有这样的属性时,为什么要将
DataGridItemsSource绑定到名为ExamsList的属性?还是您在示例中忘记了此属性? -
@SebastianRichter 这是一个错字。然而,这不是问题出在哪里
-
@stuicidle 模型来自实体数据模型
-
你的问题终于解决了。根本不需要编码。查看解决方案
标签: c# wpf mvvm datagrid mvvm-light