我有一个由两个不同对象类型组成的集合,具有相同的基类。子类A需要在单元格中显示一个按钮,子类B需要在单元格中显示一个复选框(同一列)。
如何在wpf数据网格中完成此操作?
答案 0 :(得分:0)
以下代码仅供参考,未经过编译测试......
您应该使用DataGridTemplateColumn。
指定DataGridTemplateColumn.CellTemplate
如下
<DataTemplate>
<Grid>
<Button Visibility="{Binding BaseClassPropertyValue,
Converter={StaticResource SubclassToVisibilityConverter},
ConverterParameter='Button'}"/>
<ChecBox Visibility="{Binding BaseClassPropertyValue,
Converter={StaticResource SubclassToVisibilityConverter},
ConverterParameter='CheckBox'}"/>
</Grid>
</DataTemplate>
在SubclassToVisibilityConverter.Convert()
方法中,使用以下逻辑...
if (parameter == "Button")
{
if (value is ClassA)
{
return Visibility.Visible;
}
else
{
return Visbility.Collapsed;
}
}
else if (parameter == "CheckBox")
{
if (value is ClassB)
{
return Visibility.Visible;
}
else
{
return Visbility.Collapsed;
}
}
如果有帮助,请告诉我。
答案 1 :(得分:0)
您可以随时尝试:
ObservableCollection<MyBaseClass> myCollection = new ObservableCollection<MyBaseClass>;
myCollection.Add(new Subclass_A());
myCollection.Add(new Subclass_B());
...
为每个子类创建DataTemplates,并将myCollection连接到DataGrid。在这一点上,你将有Grid填充两种类型(Subclass_A,Subclass_B)。神奇的是在DataGrid上使用DataTemplateSelector:
<DataGrid ItemTemplateSelector="{DynamicResource GridTemplateSelector}">
有了这个,Grid(实际上是大多数容器)在绘制项目时会要求DataTemplate并相应地应用。
namespace MyNamespace
{
public class GridTemplateSelector : DataTemplateSelector
{
public override DataTemplate SelectTemplate(object item, DependencyObject container)
{
FrameworkElement element = container as FrameworkElement;
if (element != null && item != null && item is Subclass_A)
{
return element.FindResource("Subclass_A_DataTemplate") as DataTemplate;
}
if (element != null && item != null && item is Subclass_B)
{
return element.FindResource("Subclass_B_DataTemplate") as DataTemplate;
}
}
}
}
答案 2 :(得分:0)
为每个模板创建两个DataTemplates
并指定DataType
。然后将内容放入DataGridTemplateColumn
:
<DataGrid>
<DataGrid.Columns>
<DataGridTemplateColumn>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ContentControl Content="{Binding}">
<ContentControl.Resources>
<DataTemplate DataType="ClassA">
<Button />
</DataTemplate>
<DataTemplate DataType="ClassB">
<CheckBox />
</DataTemplate>
</ContentControl.Resources>
</ContentControl>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>