在DatGrid中为每个项目调用转换器

时间:2015-11-20 19:46:28

标签: wpf datagrid observablecollection

我有DataGrid,绑定到ObservableCollection。我需要将ObservableCollection提供的实体中的每个Item转换为我的自定义类型“On the fly”。为了实现这种行为,我添加了以下XAML标记:

<DataGrid x:Name="CustomGrid" ItemsSource="{Binding CollectionView}" >
                <DataGrid.ItemTemplate>
                    <DataTemplate>
                        <ContentControl Content="{Binding Converter={StaticResource CustomConverter}}" />
                    </DataTemplate>
                </DataGrid.ItemTemplate>
            </DataGrid>

在上面的示例中,CollectionView是ObservableCollection,CustomConverter是我自己开发的Converter 使用上面的代码,我想将CollectionView提供的每个实体转换为使用CustomConverter的另一种类型。

但是,不幸的是,代码不起作用。我在CustomConverter中设置了brekpoint,它从不调用。 它是否存在某种转换价值的方式? 谢谢

1 个答案:

答案 0 :(得分:0)

您可能想要使用DataGridTemplateColumn.CellTemplateSelectorDataGrid.ItemTemplateSelector

另一种选择是为每个项目创建自定义样式。假设每行具有相同的列集。

<DataGrid x:Name="CustomGrid" ItemsSource="{Binding CollectionView}" AutoGenerateColumns="True" >
        <DataGrid.ItemContainerStyleSelector>
            <l:DataGridItemItemStyleSelector />
        </DataGrid.ItemContainerStyleSelector>
</DataGrid>

将样式定义为:

public class Employee
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }

    public class DataGridItemItemStyleSelector : StyleSelector
    {
        public override Style SelectStyle(object item, DependencyObject container)
        {
            Employee targetIem = item as Employee;
            if (targetIem != null)
            {
                if (targetIem.Id == 0)
                {
                    return (Style)Application.Current.FindResource("ResourceNameDefined");
                }
                else
                {
                    return base.SelectStyle(item, container);
                }
            }
            else
            {
                return base.SelectStyle(item, container);
            }

        }
    }

希望这有帮助!