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 にコミットされない理由を誰かが見つけてくれますか?