1

SQL Server 2008 データベースに、フィールドが 2 つしかない非常に単純なテーブルがあります。

Table Name: Administrators
     Field: Id (PK with AutoIncrement)
     Field: UserLogin (nvarchar)

私がやろうとしているのは、Entity Framework を使用してデータベースに接続し、このテーブルからデータを追加、削除、または編集できるようにする DataGrid を作成することです。

私が欲しいのは、テーブルを編集するときに DataGrid が ComboBox を表示することです (具体的には UserLogin フィールドの場合)。この ComboBox に、会社の Active Directory から取得されるユーザーのリストを入力する必要があります。

コードの Active Directory 部分は完了しており、既に機能しています。

私が抱えている問題は、コンボボックスにADからのユーザーのリストを表示することができたとしても、ユーザーが「Enter」を押すか別のセルをクリックして編集をコミットするたびに、コンボボックスで選択された値(またはコンボボックスでテキスト編集が有効になっているため、ユーザーが入力した値) が正しく EntitySet に戻されていないため、セルが編集モードを終了すると、表示される値は空の文字列 (エンティティが作成されたときのデフォルト値) になります。 )。

私のコードを少しだけお見せするために、2 つの「CollectionViewSource」オブジェクトがあります。1 つは Administrators テーブル用で、もう 1 つは「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 クラスには 5 つのプロパティしかありません。

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 を使用しています。WPFToolkit バージョンではなく、このバージョンの .NET に付属する DataGrid を使用しています。

コンボボックスに入力された (またはコンボボックスのドロップダウン リストで選択された) 値が DataGrid の DataContext にコミットされない理由を誰かが見つけてくれますか?

4

1 に答える 1

0

ItemsSource プロパティに TwoWay バインディングを追加する必要があると思います。デフォルトではOneWayだと思います

于 2012-12-26T01:55:10.927 に答える