DataGrid 有一个名为“UserCanAddRows”的功能,它为用户提供一个空行,他可以使用它来向 DataGrid 添加新行。但是,我想为我的用户提供一个额外的控件来添加新行,如下面的屏幕截图所示。
但现在问题出现了。我将 DataGrid 绑定到 Microsoft Entity Framework 的 ObjectSet。将项目添加到 ObjectSet 时,除非我将更改保存到数据库,否则它不会出现在那里。因此,addedObject 被保存到一些额外的列表中,其中包含所有“挂起的更改”。但是,当我以编程方式添加它们时,我的 DataGrid 并不知道这种“待定更改或 ObjectStateList”。因此,它们不会出现在 DataGrid 中,刷新视图后也不会出现。
但是,当使用“UserCanAddRows”-Feature 时,DataGrid 知道它们!所以,我想做的就是以编程方式使用此功能或模仿该功能所做的事情。
现在,我的相关代码:
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();
}
这里是 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>