WPF DataGrid - 将DataContext分配给Row

时间:2012-01-11 10:17:17

标签: wpf datagrid row datacontext

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

<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的对象具有Properties - Department和Position id,因此我实现了多个转换器 - Person to Department名称和Person to Postition名称。我不知道如何将所有这些结合起来。我认为如果我可以将DataContext属性设置为DataGrid行,那将是可能的。所以我可以将Person对象传递给转换器。

2 个答案:

答案 0 :(得分:2)

如果items集合是字典中的键列表,则必须编写一个转换器,将第一个字典键转换为字典值,即Person对象,将第二个Person对象转换为Person属性值。为此,转换器必须能够访问字典。幸运的是,有一种方法可以将附加参数传递给WPF值转换器,即Convert和ConvertBack方法中的转换器参数。在这里你可以传递字典对象,你的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;
    }
}

传递转换器参数是由绑定的ConverterParameter属性完成的。

答案 1 :(得分:1)

为了证明它们的工作原理,他们在行使WPF期货(例如绑定转换器等)方面没有多大意义 - 他们这样做。对转换器的调用次数将是巨大的,至少不是优雅的,并且很容易避免。我建议你在设置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]; }
        }
    }
相关问题