C# Can';t在另一个DataGrid(WPF)的RowDetailsTemplate内保存DataGrid中的添加或删除行
我正在使用WPF和实体框架编写一个人力资源安全跟踪应用程序,我想在其中显示和编辑一个安全事件网格,在每个选定的事件下都有一个因事件而损失小时数的月网格。这意味着事件的数据网格的RowDetailsTemplate中的小时数的数据网格 我当前可以保存对现有小时数行所做的更改,但无法将添加或删除保存到此内部数据网格。我的相关型号代码:C# Can';t在另一个DataGrid(WPF)的RowDetailsTemplate内保存DataGrid中的添加或删除行,c#,wpf,entity-framework,datagrid,rowdetailstemplate,C#,Wpf,Entity Framework,Datagrid,Rowdetailstemplate,我正在使用WPF和实体框架编写一个人力资源安全跟踪应用程序,我想在其中显示和编辑一个安全事件网格,在每个选定的事件下都有一个因事件而损失小时数的月网格。这意味着事件的数据网格的RowDetailsTemplate中的小时数的数据网格 我当前可以保存对现有小时数行所做的更改,但无法将添加或删除保存到此内部数据网格。我的相关型号代码: [Table("hr.safety_incident")] public partial class SafetyIncident { [Key] [
[Table("hr.safety_incident")]
public partial class SafetyIncident
{
[Key]
[Column(TypeName = "numeric")]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public decimal incident_id { get; set; }
[Column(TypeName = "datetime2")]
public DateTime incident_date { get; set; }
[Required]
[StringLength(30)]
public string incident_type { get; set; }
}
// EDIT: forgot this part of the class
public partial class SafetyIncident // In another file
{
protected ObservableCollection<SafetyHours> _lostHoursDetails;
[NotMapped]
public ObservableCollection<SafetyHours> LostHoursDetails
{
get { return _lostHoursDetails; }
set
{
if (_lostHoursDetails != value)
{
_lostHoursDetails = value;
}
}
}
}
[Table("hr.safety_hours")]
public partial class SafetyHours
{
[Key]
[Column(TypeName = "numeric")]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public decimal safety_hours_id { get; set; }
[Column(TypeName = "numeric")]
public decimal incident_id { get; set; }
[Column(TypeName = "datetime2")]
public DateTime safety_hours_date { get; set; }
[Column(TypeName = "numeric")]
public decimal restricted_hours { get; set; }
[Column(TypeName = "numeric")]
public decimal lost_hours { get; set; }
}
[表(“人力资源安全事件”)]
公共部分类安全事件
{
[关键]
[列(TypeName=“numeric”)]
[数据库生成(DatabaseGeneratedOption.Identity)]
公共十进制事件\u id{get;set;}
[列(TypeName=“datetime2”)]
公共日期时间事件\u日期{get;set;}
[必需]
[行政长官(30)]
公共字符串事件类型{get;set;}
}
//编辑:忘记了课程的这一部分
另一个文件中的公共部分类SafetyIncident//
{
受保护的可观测采集_losshour详细信息;
[未映射]
公众可观察到的收集损失详细信息
{
获取{return\u lostHoursDetails;}
设置
{
如果(_lostHoursDetails!=值)
{
_lostHoursDetails=值;
}
}
}
}
[表(“人力资源安全工时”)]
公共部分课程安全时间
{
[关键]
[列(TypeName=“numeric”)]
[数据库生成(DatabaseGeneratedOption.Identity)]
公共十进制安全\u小时\u id{get;set;}
[列(TypeName=“numeric”)]
公共十进制事件\u id{get;set;}
[列(TypeName=“datetime2”)]
公共日期时间安全\u小时\u日期{get;set;}
[列(TypeName=“numeric”)]
公共十进制限制时数{get;set;}
[列(TypeName=“numeric”)]
公共十进制损失时间{get;set;}
}
相关XAML:
你的问题到底是什么?内部DataGrid事件是否填充了数据?LossThoursDetails属性定义在哪里?它的类型是什么?根据我的开场白,我的问题是我无法将添加或删除保存到内部DataGrid,即使我可以填充它并修改填充它的行。我很抱歉没有显示LostHoursDetails的定义位置--它在另一个文件中定义了更多的SafetyIncident属性,我将在明天早上的编辑中修复它--但根据我的代码,它属于ObservableCollection类型。谢谢
<DataGrid x:Name="dtgAllIncidents" AutoGenerateColumns="False"
ItemsSource="{Binding Source={StaticResource safetyIncidentViewSource}}"
RowDetailsVisibilityMode="VisibleWhenSelected">
<DataGrid.Columns>
<DataGridTemplateColumn x:Name="incident_dateColumn" Header="Incident Date" Width="110" SortMemberPath="incident_date">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<DatePicker IsHitTestVisible="False"
SelectedDate="{Binding incident_date, Mode=TwoWay, NotifyOnValidationError=true, UpdateSourceTrigger=PropertyChanged, ValidatesOnExceptions=true}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<DatePicker SelectedDate="{Binding incident_date, Mode=TwoWay, NotifyOnValidationError=true, UpdateSourceTrigger=PropertyChanged, ValidatesOnExceptions=true}"/>
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
<DataGridTextColumn Header="Incident Type" Binding="{Binding incident_type}"/>
</DataGrid.Columns>
<DataGrid.RowDetailsTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text="Enter data into the blank row to add lost and restricted hours.”/>
<DataGrid x:Name="dtgLostHoursDetails" ItemsSource="{Binding LostHoursDetails}" AutoGenerateColumns="False" CanUserAddRows="True" CanUserDeleteRows="True">
<DataGrid.Columns>
<DataGridTemplateColumn x:Name="incident_dateColumn" Header="Month in Which Hours Lost">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<DatePicker IsHitTestVisible="False"
SelectedDate="{Binding safety_hours_date, Mode=TwoWay, NotifyOnValidationError=true, UpdateSourceTrigger=PropertyChanged, ValidatesOnExceptions=true}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<DatePicker SelectedDate="{Binding safety_hours_date, Mode=TwoWay, NotifyOnValidationError=true, UpdateSourceTrigger=PropertyChanged, ValidatesOnExceptions=true}"/>
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
<DataGridTextColumn Width="SizeToHeader" Header="Lost Hours" Binding="{Binding lost_hours}"/>
<DataGridTextColumn Width="SizeToHeader" Header="Restricted Hours" Binding="{Binding restricted_hours}"/>
</DataGrid.Columns>
</DataGrid>
</StackPanel>
</DataTemplate>
</DataGrid.RowDetailsTemplate>
</DataGrid>
private ObservableCollection<SafetyIncident> _incidents;
private SafetyIncidentsViewModel _incidentsVM = new SafetyIncidentsViewModel();
private void mniIncidents_Click(object sender, RoutedEventArgs e)
{
CollectionViewSource safetyIncidentViewSource = ((CollectionViewSource)this.FindResource("safetyIncidentViewSource")));
_incidents = _incidentsVM.GetIncidents();
safetyIncidentViewSource.Source = _incidents;
}
private void btnSaveIncidents_Click(object sender, RoutedEventArgs e)
{
_incidentsVM.SaveChanges();
dtgAllIncidents.Items.Refresh();
}
public class SafetyIncidentsViewModel
{
private Corp_DB _context = new Corp_DB();
public ObservableCollection<SafetyIncident> GetIncidents()
{
ObservableCollection<SafetyIncident> results = null;
LoadSafetyIncidents();
results = _context.safety_incident.Local;
return results;
}
private void LoadSafetyIncidents()
{
_context.safety_incident.OrderBy(si => si.incident_date).Load();
_context.safety_hours.Load();
foreach (var i in _context.safety_incident)
{
var lostHours = new ObservableCollection<SafetyHours>();
foreach (var h in _context.safety_hours.Where(sh => sh.incident_id == i.incident_id).OrderBy(sh => sh.safety_hours_date))
{
lostHours.Add(h);
}
i.LostHoursDetails = lostHours;
}
}
public void SaveChanges()
{
// Assign new hours rows their safety incident. Open to more automatic way...
foreach (var si in _context.safety_incident)
{
foreach (var sh in si.LostHoursDetails.Where(h => h.incident_id == 0))
{
sh.incident_id = si.incident_id;
}
}
_context.SaveChanges();
}