Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
wpf数据网格中的不同单元格样式取决于ItemsSource中的数据类型_Wpf_Datagrid_Toolkit - Fatal编程技术网

wpf数据网格中的不同单元格样式取决于ItemsSource中的数据类型

wpf数据网格中的不同单元格样式取决于ItemsSource中的数据类型,wpf,datagrid,toolkit,Wpf,Datagrid,Toolkit,我想知道是否可以根据ItemsSource集合中的项类型更改wpf数据网格中列的样式 我有一个来自wpf工具包的wpf数据网格。网格中的单行应根据ItemsSource集合中的项类型进行样式设置。因此,所有项都具有相同的基类类型,但某些派生类型的列应具有不同的样式 这可能吗 谢谢:-)是的,有几种方法可以做到这一点。我想说的是编写自己的自定义“typeswitch”转换器,它根据输入类型选择一个值。像这样: public class TypeSwitchConverter : Dictionar

我想知道是否可以根据ItemsSource集合中的项类型更改wpf数据网格中列的样式

我有一个来自wpf工具包的wpf数据网格。网格中的单行应根据ItemsSource集合中的项类型进行样式设置。因此,所有项都具有相同的基类类型,但某些派生类型的列应具有不同的样式

这可能吗


谢谢:-)

是的,有几种方法可以做到这一点。我想说的是编写自己的自定义“typeswitch”转换器,它根据输入类型选择一个值。像这样:

public class TypeSwitchConverter : Dictionary<Type, object>, IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, .CultureInfo culture)
    {
        foreach (var mapping in this)
        {
            if (mapping.Key.IsAssignableFrom(value.GetType()))
            {
                return mapping.Value;
            }
        }

        return null;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}
仅WPF的解决方案:

我参加聚会有点晚了,但如果有人想做这样的事情,只有WPF的解决方案。没有DataGridColumn类可以直接查找适当的DataTemplate,但我们可以间接使用ContentPresenter,如下所示:

<Window.Resources>
    <DataTemplate DataType="{x:Type models:Employee}">
        <Grid>...</Grid>
    </DataTemplate>

    <DataTemplate DataType="{x:Type models:Manager}">
        <Grid>...</Grid>
    </DataTemplate>
</Window.Resources>

<DataGrid ... >
    <DataGrid.Columns>
        <DataGridTemplateColumn Header="MyColumn">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <ContentPresenter Content="{Binding}" />
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
    </DataGrid.Columns>
</DataGrid>

...
...


通过将ContentPresenter夹在CellTemplate中的DataTemplate中,我们可以达到预期的效果。

感谢您的快速回复!问题只是我想根据items集合中的类型将不同的控件添加到堆栈面板中。你将如何解决这个问题?因此,就好像有一个应该根据ItemsCollection中的类型添加不同的控件对象一样。然后只需使用上面的
TypeSwitchConverter
ItemTemplate
属性绑定到不同的模板。实际上,很抱歉,稍微更正-您将无法直接绑定它,因为在设置
ItemTemplate
时,您将没有当前项目。因此,您可以定义一个
ItemTemplate
,其中包含任何类型的单个元素(例如
ContentPresenter
),然后使用开关转换器绑定该元素的
Template
属性。这是一个很好的解决方案,但是否可以将其扩展到多个列?如果我们只依赖数据类型,我们如何为不同的列(例如标题和下属)选择“正确”的数据模板?
<Window.Resources>
    <DataTemplate DataType="{x:Type models:Employee}">
        <Grid>...</Grid>
    </DataTemplate>

    <DataTemplate DataType="{x:Type models:Manager}">
        <Grid>...</Grid>
    </DataTemplate>
</Window.Resources>

<DataGrid ... >
    <DataGrid.Columns>
        <DataGridTemplateColumn Header="MyColumn">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <ContentPresenter Content="{Binding}" />
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
    </DataGrid.Columns>
</DataGrid>