【发布时间】:2011-09-08 20:05:41
【问题描述】:
我有一个由两种不同对象类型组成的集合,具有相同的基类。子类 A 需要在单元格中显示按钮,子类 B 需要在单元格中显示复选框(同一列)。
如何在 wpf 数据网格中完成此操作?
【问题讨论】:
标签: wpf wpfdatagrid
我有一个由两种不同对象类型组成的集合,具有相同的基类。子类 A 需要在单元格中显示按钮,子类 B 需要在单元格中显示复选框(同一列)。
如何在 wpf 数据网格中完成此操作?
【问题讨论】:
标签: wpf wpfdatagrid
以下代码仅供参考,未经编译测试...
您应该为此使用 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;
}
}
如果这有帮助,请告诉我。
【讨论】:
你总是可以试试这个:
ObservableCollection<MyBaseClass> myCollection = new ObservableCollection<MyBaseClass>;
myCollection.Add(new Subclass_A());
myCollection.Add(new Subclass_B());
...
为每个子类创建 DataTemplates 并将您的 myCollection 连接到 DataGrid。此时,您将拥有填充有两种类型(Subclass_A、Subclass_B)的 Grid。神奇的是在您的 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;
}
}
}
}
【讨论】:
创建两个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>
【讨论】: