2012-10-11 60 views
0

我有一個非常簡單的表格對我的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?

+0

你有沒有嘗試添加「,Mode = TwoWay」到你選擇的值/項目綁定?這似乎太容易是正確的:) –

+0

不幸的是,「模式= TwoWay」在你描述的地方沒有工作:) – Samir

+2

@Samir我知道這個問題太老了評論,但仍然如果你知道,那麼你可以請發佈可能的解決方案? – Vishal

回答

0

我想你必須將TwoWay綁定添加到ItemsSource屬性中。我認爲默認情況下,它是單向的