我的 SQL Server 2008 数据库中有一个非常简单的表,只有两个字段:
Table Name: Administrators
Field: Id (PK with AutoIncrement)
Field: UserLogin (nvarchar)
我要做的是创建一个 DataGrid,它允许我添加、删除或编辑该表中的数据,使用 Entity Framework 连接到数据库。
我想要的是 DataGrid 在编辑表时显示一个 ComboBox(特别是对于 UserLogin 字段),并且我希望这个 ComboBox 填充有将从我公司的 Active Directory 中检索到的用户列表。
代码的 Active Directory 部分已完成并且已经开始工作。
我遇到的问题是,即使我设法让组合框显示我的 AD 中的用户列表,每当用户按下“Enter”或单击另一个单元格以提交编辑时,组合框上选择的值(或用户键入的值,因为在组合框中启用了文本编辑)没有正确设置回我的 EntitySet,因此当单元格离开编辑模式时,显示的值是一个空字符串(创建实体时的默认值)。
只是为了向您展示一些我的代码,我有两个“CollectionViewSource”对象,一个用于 Administrators 表,一个用于“ActiveDirectoryUser”对象列表。“ActiveDirectoryUser”是我编写的一个类,其中包含来自每个 AD 用户的一些信息。
这是我设置 CollectionViewSource.Source 属性的代码:
// Global variable declaration
public List<ActiveDirectoryUser> adUsers = new List<ActiveDirectoryUsers>();
// The method below is called in the Window_Loaded() event
private void SetUpCollectionViewSourceBindings()
{
adUsers = GetListOfADUsers(); // No need to show the code for the GetListOfADUsers() method
CollectionViewSource adViewSource = (CollectionViewSource)FindResource("ADUsersSource");
adViewSource.Source = adUsers;
CollectionViewSource adminViewSource = (CollectionViewSource)FindResource("AdministratorsSource");
ObjectQuery<Administrators> adminQuery = GetAdministrators();
adminViewSource.Source = adminQuery.Execute(MergeOption.OverwriteChanges);
}
private ObjectQuery<Administrators> GetAdministrators()
{
var adminQuery = (from admin in dbEntities.Administrators
select admin);
return adminQuery as ObjectQuery<Administrators>;
}
我的 ActiveDirectoryUser 类只有五个属性:
public class ActiveDirectoryUser
{
public string FirstName { get; private set; }
public string LastName { get; private set; }
public string SAMAccountName { get; private set; } // User login information
public string UserPrincipalName { get; private set; }
public string FullName { get { return string.Format("{0} {1}", FirstName, LastName); } }
}
在 MainWindow.xaml 文件的 XAML 中,我将以下 CollectionViewSources 添加到资源中:
<Window.Resources>
<CollectionViewSource x:Key="AdministratorsSource" />
<CollectionViewSource x:Key="ADUsersSource" />
</Window.Resources>
然后,我添加了以下 DataGrid,其绑定如下所示:
<DataGrid x:Name="dgAdministrators"
DataContext="{Binding Source={StaticResource AdministratorsSource}}"
ItemsSource="{Binding}"
AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTemplateColumn Header="User Login">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path=UserLogin, ValidatesOnDataErrors=True}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<ComboBox IsReadOnly="False"
IsEditable="True"
IsTextSearchCaseSensitive="False"
IsTextSearchEnabled="True"
ItemsSource="{Binding Source={StaticResource ADUsersSource}}"
DisplayMemberPath="FullName"
SelectedValuePath="SAMAccountName"
SelectedValue="{Binding DataContext.UserLogin, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}}"
SelectedItem="{Binding UserLogin}"
/>
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
我使用的是 .NET 4.0,我使用的是这个版本的 .NET 附带的 DataGrid,而不是 WPFToolkit 版本。
谁能帮我找出为什么在组合框中键入的值(或在组合框的下拉列表中选择的值)没有提交回我的 DataGrid 的 DataContext?