我有一种情况,其中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对象传递给转换器。
答案 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]; }
}
}