WPF DataGrid-将DataContext分配给行

WPF DataGrid-将DataContext分配给行,wpf,datagrid,row,datacontext,Wpf,Datagrid,Row,Datacontext,我有一种情况,DataGrid的ItemsSource属性是一个整数数组。这些整数是对应字典的键。我需要在列中显示的是字段,它们是dictionary value对象的成员 <DataGrid ItemsSource="{Binding Path=thisDataContext, ElementName=control, Mode=OneWay}" AutoGenerateColumns="False">

我有一种情况,DataGrid的ItemsSource属性是一个整数数组。这些整数是对应字典的键。我需要在列中显示的是字段,它们是dictionary value对象的成员

<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>


我正在处理的类Person的对象具有属性-部门和职位ID,因此我实现了多个转换器-人员到部门名称和人员到职位名称。我不知道如何把它们结合起来。我认为,如果我可以将DataContext属性设置为DataGrid行,这是可能的。因此,我可以将Person对象传递给转换器。

如果items集合是字典中的键列表,则必须编写一个转换器,将第一个字典键转换为字典值,即Person对象和第二个Person对象转换为Person属性值。要实现这一点,转换器必须能够访问字典。幸运的是,有一种方法可以将额外的参数传递给WPF值转换器,即Convert和ConvertBack方法中的converter参数。在这里,您可以传递dictionary对象,您的Convert方法如下所示:

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;
    }
}
公共对象转换(对象值、类型targetType、对象参数、CultureInfo区域性) { IDictionary dict=作为IDictionary的参数; if(dict!=null&&value为int) { 人员p=dict[(int)值]; 返回p.SomeProperty; } }
传递转换器参数是由绑定的属性完成的。

执行WPF期货(如绑定转换器等)并没有多大意义,只是为了证明它们工作——它们确实工作。对converter的调用数量将是巨大的,这至少不是优雅的,而且很容易避免。我建议您在设置grid的ItemsSource之前对收集进行预处理

我个人会使用LINQ项目,并将字典建立为类的静态成员。喊我们一声,我就发一个样品

更新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]; }
        }
    }
公共类人物
{
私人静态词典部门;
静态人()
{
Person.SetUpDictionaries();
}
专用静态字典()
{
Person.Departments=新词典(3)
{
{1,“IT”},
{1,“金融”},
{1,“HR”}
};
}
公共int部门ID
{
得到;
设置
}
公共字符串部门
{
获取{return Person.Departments[this.DepartmentId];}
}
}

您究竟使用什么作为网格的ItemsSource?一个整数集合还是一个Person obejcts集合(由您的XAML暗示)?这是一个整数集合,然后{Binding}就是您能做的。XAML意味着您使用的是对象,而不是整数。我可以访问代码隐藏中的字典。我想要实现的不是每次需要提取某些属性时都在字典中搜索Person对象,而是将一个精确的Person对象传递给转换器,而不是id。感谢您指向ConverterParameter。我曾尝试在ConverterParameter中使用绑定到Person对象,但这是不可能的。