2012-01-11 24 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