如何更改WPF数据网格单元格的内容,具体取决于objecttype

时间:2011-09-08 20:05:42

标签: wpf wpfdatagrid

我有一个由两个不同对象类型组成的集合,具有相同的基类。子类A需要在单元格中显示一个按钮,子类B需要在单元格中显示一个复选框(同一列)。

如何在wpf数据网格中完成此操作?

3 个答案:

答案 0 :(得分:0)

以下代码仅供参考,未经过编译测试......

  1. 您应该使用DataGridTemplateColumn。

  2. 指定DataGridTemplateColumn.CellTemplate如下

    <DataTemplate>
       <Grid>
           <Button Visibility="{Binding BaseClassPropertyValue,
                         Converter={StaticResource SubclassToVisibilityConverter},
                              ConverterParameter='Button'}"/>
           <ChecBox Visibility="{Binding BaseClassPropertyValue,
                         Converter={StaticResource SubclassToVisibilityConverter},
                              ConverterParameter='CheckBox'}"/>
       </Grid> 
    </DataTemplate>
    
  3. 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;
      }
    }
    
  4. 如果有帮助,请告诉我。

答案 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>