我有一個非常簡單的表格對我的SQL Server 2008數據庫,只有兩個領域:與組合框,CollectionViewSource和Entity Framework WPF 4 Datagrid的
Table Name: Administrators
Field: Id (PK with AutoIncrement)
Field: UserLogin (nvarchar)
我想要做的就是創建一個DataGrid即會允許我使用Entity Framework連接到數據庫來添加,刪除或編輯此表中的數據。
我要的是爲DataGrid編輯表(專爲用戶登陸場)時顯示一個ComboBox,我想這個組合框與將要從我公司的Active Directory中檢索用戶的列表來填充。
代碼的活動目錄部分已完成並且已在工作。
我遇到的問題是,即使我管理組合框以顯示AD中的用戶列表,只要用戶按下「Enter」或在另一個單元格中點擊以提交編輯,組合框(或用戶鍵入的值,因爲在組合框中啓用了文本編輯)沒有被正確地設置回我的EntitySet,所以當單元離開編輯模式時,顯示的值是一個空字符串(默認值爲該實體被創建)。
爲了向您展示一些代碼,我有兩個「CollectionViewSource」對象,一個用於管理員表,另一個用於「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); } }
}
在我的XAML的MainWindow.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的,而不是WPFToolkit版本DataGrid中。
任何人都可以幫助我找出爲什麼在組合框中鍵入的值(或在組合框的下拉列表中選擇)沒有返回到我的DataGrid的DataContext?
你有沒有嘗試添加「,Mode = TwoWay」到你選擇的值/項目綁定?這似乎太容易是正確的:) –
不幸的是,「模式= TwoWay」在你描述的地方沒有工作:) – Samir
@Samir我知道這個問題太老了評論,但仍然如果你知道,那麼你可以請發佈可能的解決方案? – Vishal