2012-01-11 46 views
1

我有一種情況,一個DataGrid的ItemsSource屬性是一個整數數組。這些整數是相應字典的關鍵。我需要在列中顯示的是字段,它們是字典值對象的成員。WPF的DataGrid - 分配的DataContext到行

<DataGrid ItemsSource="{Binding Path=thisDataContext, ElementName=control, Mode=OneWay}" 
      AutoGenerateColumns="False">             
    <DataGrid.Columns> 
     <DataGridTextColumn Header="Name" Width="0.3*" Binding="{Binding Converter={StaticResource IntToPersonConverter}, Mode=OneWay }" /> 
     <DataGridTextColumn Header="Department" Width="0.3*" Binding="{Binding Path=DepartmentIDX, Converter={StaticResource DepartmentConverter}, Mode=OneWay }" /> 
     <DataGridTextColumn Header="Position" Width="0.3*" Binding="{Binding Path=EmployeeTypeIDX, Converter={StaticResource EmployeeTypeConverter}, Mode=OneWay }" /> 
    </DataGrid.Columns>  
</DataGrid> 

一類人我工作的對象有屬性 - 部門及職務的ID,所以我已經實現了多轉換器 - 人到部門名稱和個人到Postition名。我不知道如何將它們全部結合起來。我認爲這將是可能的,如果我可以將DataContext屬性設置爲DataGrid行。所以我可以將一個Person對象傳遞給轉換器。

+1

究竟什麼是您使用的ItemsSource爲你格 - 集合整數或個人obejcts(這是由你的XAML暗示)的集合? – 2012-01-11 11:40:34

+0

它是整數的集合 – tyumener 2012-01-12 04:00:55

+0

然後{結合}是儘可能你可以走了。無論如何,XAML暗示你使用的是對象而不是整數。 – 2012-01-12 09:19:54

回答

1

有沒有什麼意義行使WPF期貨如結合器等只是爲了證明他們工作的緣故 - 他們這樣做。對轉換器的調用數量會很大,至少不夠優雅,而且很容易避免。我建議你在設置網格的ItemsSource之前預先處理你的集合。

我會親自使用LINQ projectsions,並建立詞典作爲類的靜態成員。給我們留言,我會張貼一個樣本。

更新1 - 示例代碼

public class Person 
    { 
     private static Dictionary<int, string> Departments; 

     static Person() 
     { 
      Person.SetUpDictionaries(); 
     } 

     private static void SetUpDictionaries() 
     { 
      Person.Departments = new Dictionary<int, string>(3) 
      { 
       { 1, "IT" }, 
       { 1, "Finance" }, 
       { 1, "HR" } 
      }; 
     } 

     public int DepartmentId 
     { 
      get; 
      set; 
     } 

     public string Depratment 
     { 
      get { return Person.Departments[this.DepartmentId]; } 
     } 
    } 
+0

喊:) 如果你有一個示例代碼,如果你張貼在這裏將是巨大的。 – tyumener 2012-01-12 11:32:09

2

如果項目集合是鑰匙進入字典的名單,你會寫,首先字典鍵轉換爲字典中的值,即Person對象和第二用戶對象的人的屬性值的轉換器。爲了達到這個目的,轉換器必須能夠訪問字典。幸運的是,有一種方法可以將附加參數傳遞給WPF值轉換器,即Convert和ConvertBack方法中的轉換器參數。在這裏,你可以把字典對象和你的轉換方法看起來是這樣的:

public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
{ 
    IDictionary<int, Person> dict = parameter as IDictionary<int, Person>; 
    if (dict != null && value is int) 
    { 
     Person p = dict[(int)value]; 
     return p.SomeProperty; 
    } 
} 

傳遞轉換參數由綁定的ConverterParameter屬性來完成。

+0

我有權訪問代碼隱藏字典。我想實現的不是在每次需要拉取某個屬性時在字典中搜索我的Person對象,而是將確切的Person對象傳遞給轉換器而不是id。 感謝您指向ConverterParameter。我試圖使用綁定到ConverterParameter中的Person對象 - 但這是不可能的。 – tyumener 2012-01-12 03:45:20