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