我有一个由两个不同对象类型组成的集合,具有相同的基类。子类A需要在单元格中显示一个按钮,子类B需要在单元格(同一列)中显示一个复选框。
我如何在wpf数据网格中实现这一点?
以下代码仅供指导,未进行编译测试…
-
你应该使用datagridtemplatecolcolumn
-
按如下方式指定
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; } }
如果有帮助请告诉我
你可以试试这个:
ObservableCollection<MyBaseClass> myCollection = new ObservableCollection<MyBaseClass>;
myCollection.Add(new Subclass_A());
myCollection.Add(new Subclass_B());
…
为每个子类创建datatemplate,并将myCollection连接到DataGrid。在这一点上,你将有网格填充两种类型(Subclass_A, Subclass_B)。神奇的是在DataGrid上使用DataTemplateSelector:
<DataGrid ItemTemplateSelector="{DynamicResource GridTemplateSelector}">
有了这个,网格(实际上大多数容器)在绘制项目时将请求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;
}
}
}
}
创建两个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>