当绑定到EF实体时,向WPF DataGrid添加行(以编程方式执行“UserCanAddress”)
DataGrid有一个名为“UserCanAddress”的功能,它为用户提供了一个空行,用户可以使用它向DataGrid添加新行。但是,我想为我的用户提供一个额外的控件来添加新行,如下面的屏幕截图所示 但现在问题出现了。我已将DataGrid绑定到Microsoft实体框架的对象集。向ObjectSet添加项时,除非将更改保存到数据库,否则该项不会显示在那里。因此,addedObject被保存到一个额外的列表中,该列表保存所有“挂起的更改”。但是,当我以编程方式添加这些更改或ObjectStateList时,我的DataGrid没有意识到这个“挂起的更改或ObjectStateList”。因此,它们不会显示在DataGrid中,也不会在刷新视图后显示 但是,当使用“UserCanAddRows”功能时,DataGrid会意识到它们!因此,我想做的就是以编程方式使用此功能或模仿该功能所做的事情。 现在,我的相关代码:当绑定到EF实体时,向WPF DataGrid添加行(以编程方式执行“UserCanAddress”),wpf,entity-framework,binding,datagrid,wpfdatagrid,Wpf,Entity Framework,Binding,Datagrid,Wpfdatagrid,DataGrid有一个名为“UserCanAddress”的功能,它为用户提供了一个空行,用户可以使用它向DataGrid添加新行。但是,我想为我的用户提供一个额外的控件来添加新行,如下面的屏幕截图所示 但现在问题出现了。我已将DataGrid绑定到Microsoft实体框架的对象集。向ObjectSet添加项时,除非将更改保存到数据库,否则该项不会显示在那里。因此,addedObject被保存到一个额外的列表中,该列表保存所有“挂起的更改”。但是,当我以编程方式添加这些更改或ObjectSt
private readonly MyEntities m_db;
private CollectionViewSource m_workItemViewSource;
private ObjectSet<WorkItem> m_workItems;
public SettingsWindow(MyEntities db)
{
m_db = db;
InitializeComponent();
m_workItemViewSource = ((System.Windows.Data.CollectionViewSource)(this.FindResource("workItemViewSource")));
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
m_workItems = m_db.WorkItems;
m_workItemViewSource.Source = m_workItems;
}
private void AddWorkItemButton_Click(object sender, RoutedEventArgs e)
{
WorkItem workItem = m_db.CreateObject<WorkItem>();
workItem.name = AddWorkItemTextBox.Text;
workItem.is_shown = true;
AddWorkItemTextBox.Text = "";
m_workItems.AddObject(workItem);
m_workItemViewSource.View.Refresh();
}
私有只读MyEntities m_db;
私有集合ViewSource m_workItemViewSource;
私有对象集m_工作项;
公共设置Swindow(MyEntities db)
{
m_db=db;
初始化组件();
m_workItemViewSource=((System.Windows.Data.CollectionViewSource)(this.FindResource(“workItemViewSource”));
}
已加载私有无效窗口(对象发送器、路由目标)
{
m_工作项=m_db工作项;
m_workItemViewSource.Source=m_workItems;
}
私有void AddWorkItemButton\u单击(对象发送方,路由目标)
{
WorkItem WorkItem=m_db.CreateObject();
workItem.name=AddWorkItemTextBox.Text;
workItem.is_显示为真;
AddWorkItemTextBox.Text=“”;
m_workItems.AddObject(workItem);
m_workItemViewSource.View.Refresh();
}
这里是XAML
<Window.Resources>
<CollectionViewSource x:Key="workItemViewSource" d:DesignSource="{d:DesignInstance my:WorkItem, CreateList=True}" />
</Window.Resources>
<DockPanel Name="WindowDockPanel" LastChildFill="True" DataContext="{StaticResource workItemViewSource}">
<DataGrid AutoGenerateColumns="False" EnableRowVirtualization="True" ItemsSource="{Binding}" Name="workItemDataGrid" RowDetailsVisibilityMode="VisibleWhenSelected" Width="280" CanUserAddRows="True" CanUserDeleteRows="False">
<DataGrid.Columns>
<DataGridCheckBoxColumn x:Name="is_shownColumn" Binding="{Binding Path=is_shown, Mode=TwoWay}" Header="{x:Static Resources:EntityStrings.isShown}" Width="SizeToHeader" >
</DataGridCheckBoxColumn>
<DataGridTextColumn x:Name="nameColumn" Binding="{Binding Path=name, Mode=TwoWay}" Header="{x:Static Resources:EntityStrings.workItem}" Width="*" />
</DataGrid.Columns>
</DataGrid>
</DockPanel>
我已经继续前进,并以不同的方式实现了它。但我现在获得了一些经验。我学到的是,来自EF上下文的集合(在我的例子中是m_db)没有实现INotifyChange接口。他们的列表中也没有新添加的条目。我在另一个地方再次遇到这个问题,这次“正确”解决了: 关键是不要使用上下文提供的集合。如果你把它们放在不同的集合中,比如ObservaleCollection,这并没有什么坏处。因此,它应该与这些更改一起工作,但我无法再测试它:
private readonly MyEntities m_db;
private CollectionViewSource m_workItemViewSource;
private ObserverableCollection<WorkItem> m_workItems; //changed!
public SettingsWindow(MyEntities db)
{
m_db = db;
InitializeComponent();
m_workItemViewSource = ((System.Windows.Data.CollectionViewSource)(this.FindResource("workItemViewSource")));
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
m_workItems = new ObservableCollection( m_db.WorkItems ); //changed!
m_workItemViewSource.Source = m_workItems;
}
private void AddWorkItemButton_Click(object sender, RoutedEventArgs e)
{
WorkItem workItem = m_db.CreateObject<WorkItem>();
workItem.name = AddWorkItemTextBox.Text;
workItem.is_shown = true;
AddWorkItemTextBox.Text = "";
m_workItems.AddObject(workItem);
m_workItemViewSource.View.Refresh();
}
私有只读MyEntities m_db;
私有集合ViewSource m_workItemViewSource;
私有ObserverableCollection Mu工作项//改变!
公共设置Swindow(MyEntities db)
{
m_db=db;
初始化组件();
m_workItemViewSource=((System.Windows.Data.CollectionViewSource)(this.FindResource(“workItemViewSource”));
}
已加载私有无效窗口(对象发送器、路由目标)
{
m_workItems=新的ObservableCollection(m_db.workItems);//已更改!
m_workItemViewSource.Source=m_workItems;
}
私有void AddWorkItemButton\u单击(对象发送方,路由目标)
{
WorkItem WorkItem=m_db.CreateObject();
workItem.name=AddWorkItemTextBox.Text;
workItem.is_显示为真;
AddWorkItemTextBox.Text=“”;
m_workItems.AddObject(workItem);
m_workItemViewSource.View.Refresh();
}