C# 带有组合框、CollectionViewSource和实体框架的WPF 4数据网格

C# 带有组合框、CollectionViewSource和实体框架的WPF 4数据网格,c#,wpf,entity-framework-4,wpfdatagrid,C#,Wpf,Entity Framework 4,Wpfdatagrid,我的SQL Server 2008数据库中有一个非常简单的表,只有两个字段: Table Name: Administrators Field: Id (PK with AutoIncrement) Field: UserLogin (nvarchar) 我试图做的是创建一个DataGrid,它允许我使用EntityFramework连接到数据库,从这个表中添加、删除或编辑数据 我希望DataGrid在编辑表时显示一个组合框(特别是针对UserLogin字段),并且我希望这

我的SQL Server 2008数据库中有一个非常简单的表,只有两个字段:

Table Name: Administrators
     Field: Id (PK with AutoIncrement)
     Field: UserLogin (nvarchar)
我试图做的是创建一个DataGrid,它允许我使用EntityFramework连接到数据库,从这个表中添加、删除或编辑数据

我希望DataGrid在编辑表时显示一个组合框(特别是针对UserLogin字段),并且我希望这个组合框中填充一个将从我公司的Active Directory检索的用户列表

代码的Active Directory部分已经完成,并且已经开始工作

我的问题是,即使我设法让combobox显示我广告中的用户列表,每当用户按下“Enter”键或在另一个单元格中单击以提交编辑时,combobox上选择的值(或用户键入的值,因为combobox中启用了文本编辑)未正确设置回my EntitySet,因此当单元格离开编辑模式时,显示的值为空字符串(创建实体时的默认值)

为了让您了解一下我的代码,我有两个“CollectionViewSource”对象,一个用于Administrators表,另一个用于“ActiveDirectoryUser”对象列表。“ActiveDirectoryUser”是我编写的一个类,它保存来自每个AD用户的一些信息

以下是设置CollectionViewSource的代码。源属性:

// 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>;
}
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>

我使用的是.NET4.0,我使用的是这个版本的.NET附带的DataGrid,而不是WPFToolkit版本


有人能帮我找出为什么combobox中键入的值(或combobox下拉列表中选择的值)没有提交回我的DataGrid的DataContext吗?

我认为您必须将双向绑定添加到ItemsSource属性中。我认为默认情况下是单向的

您是否尝试将“、Mode=TwoWay”添加到所选的值/项目绑定中?这似乎太容易出错:)不幸的是,在你描述的地方,“Mode=TwoWay”不起作用:)@Samir我知道这个问题太老了,无法评论,但如果你知道,你能发布一个可能的解决方案吗?