WPF DataGrid-将DataContext分配给行
我有一种情况,DataGrid的ItemsSource属性是一个整数数组。这些整数是对应字典的键。我需要在列中显示的是字段,它们是dictionary value对象的成员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="{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对象,但这是不可能的。