【问题标题】:WPF DataGrid - Assigning DataContext to RowWPF DataGrid - 将 DataContext 分配给行
【发布时间】:2012-02-07 17:02:17
【问题描述】:

我有一种情况,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 类的对象具有属性 - 部门和职位 ID,因此我实现了多个转换器 - 人员到部门名称和人员到职位名称。我不知道如何将所有这些结合起来。我认为如果我可以将 DataContext 属性设置为 DataGrid Rows,那将是可能的。所以我可以将一个 Person 对象传递给一个转换器。

【问题讨论】:

  • 您究竟将什么用作网格的 ItemsSource - 整数集合或 Person 对象集合(由您的 XAML 暗示)?
  • 是整数的集合
  • 那么 {Binding} 是你可以去的地方。您的 XAML 暗示您使用的是对象而不是整数。

标签: wpf datagrid row datacontext


【解决方案1】:

如果 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 属性完成。

【讨论】:

  • 我可以访问代码隐藏中的字典。我想要实现的不是每次需要提取某些属性时都在字典中搜索我的 Person 对象,而是将确切的 Person 对象传递给转换器而不是 id。感谢您指向 ConverterParameter。我尝试在 ConverterParameter 中使用绑定到 Person 对象 - 但这是不可能的。
【解决方案2】:

仅仅为了证明它们可以工作而执行 WPF 期货(例如绑定转换器等)并没有多大意义——它们确实有效。对转换器的调用数量将是巨大的,这至少不是优雅的,而且很容易避免。我建议您在设置网格的 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]; }
        }
    }

【讨论】:

  • 大喊 :) 如果您有示例代码,最好将其发布在这里。
猜你喜欢
  • 1970-01-01
  • 2011-10-28
  • 2021-10-29
  • 1970-01-01
  • 1970-01-01
  • 2012-12-25
  • 2013-11-16
  • 2010-11-01
  • 2010-11-22
相关资源
最近更新 更多