day*_*neo 12
您正在寻找的事件是DataGrid.AddingNewItem事件.此事件将允许您根据需要配置新对象,然后将其应用于AddingNewItemEventArgs的NewItem属性.
XAML:
<DataGrid Name="GrdBallPenetrations"
ItemsSource="{Binding BallPenetrationCollection}"
SelectedItem="{Binding CurrentSelectedBallPenetration}"
AutoGenerateColumns="False"
IsReadOnly="False"
CanUserAddRows="True"
CanUserDeleteRows="True"
IsSynchronizedWithCurrentItem="True"
AddingNewItem="GrdBallPenetrations_AddingNewItem">
Run Code Online (Sandbox Code Playgroud)
代码背后:
private void GrdBallPenetrations_AddingNewItem(object sender, AddingNewItemEventArgs e)
{
e.NewItem = new BallPenetration
{
Id = Guid.NewGuid(),
CarriageWay = CariageWayType.Plus,
LaneNo = 1,
Position = Positions.BetweenWheelTracks
};
}
Run Code Online (Sandbox Code Playgroud)
当用户离开他正在编辑的行时,对象将被持久化(插入或更新).移动到同一行中的另一个单元格通过数据绑定更新相应的属性,但尚未发信号通知模型(或数据访问层).唯一有用的事件是DataGrid.RowEditEnding.这是在提交修改的行之前触发的.
XAML
<DataGrid ...
RowEditEnding="MyDataGrid_RowEditEnding">
</DataGrid>
Run Code Online (Sandbox Code Playgroud)
代码背后
private void MyDataGrid_RowEditEnding(object sender, DataGridRowEditEndingEventArgs e)
{ // Only act on Commit
if (e.EditAction == DataGridEditAction.Commit)
{
var newItem = e.Row.DataContext as MyDataboundType;
if (newItem is NOT in my bound collection) ... handle insertion...
}
}
Run Code Online (Sandbox Code Playgroud)
该解决方案的所有学分都归Diederik Krolls(Original Post)所有.我的尊敬.
我建议不要在视图(网格)中处理事件,而是建议观察绑定对象,然后将逻辑放在那里.这可以使您的业务逻辑与业务对象保持一致.
既然你被束缚了DataTable,最简单的方法就是订阅DataTable.TableNewRow.
我添加这个是因为我刚刚花了近 2 个小时试图弄清楚当您绑定到视图模型集合并且需要控制这些视图模型的构造时如何让 DataGrid 添加新行。
因此,设置是您有一个ObservableCollection<MyViewModel>绑定到ItemsSourceDataGrid 的。您需要MyViewModel在视图模型层中创建自己。
这就是 DataGrid 自动添加行时的工作方式:
MyViewModel将通过调用该类型的默认构造函数绑定到该行。谁知道它为什么这样做,但如果MyViewModel没有默认构造函数,它将无法显示该空白行。这可能是您陷入困境的地方,因为您没有默认构造函数,因为您需要自己创建对象。不幸的是,您需要去添加一个。再次注意,如果元素类型是接口,这注定会失败。集合的元素类型必须是具有默认构造函数的具体类。AddingNewItem:您可以在此处拦截添加操作并切换它使用您自己的实例创建的默认构造函数创建的实例。它AddingNewItemEventArgs.NewItem有一个设置器,您可以将当前项目交换为您自己的项目。| 归档时间: |
|
| 查看次数: |
27924 次 |
| 最近记录: |