【问题标题】:How to change content of a WPF datagrid cell, depending on objecttype如何根据对象类型更改 WPF 数据网格单元格的内容
【发布时间】:2011-09-08 20:05:41
【问题描述】:

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

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

【问题讨论】:

    标签: wpf wpfdatagrid


    【解决方案1】:

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

    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;
        }
      }
      

    如果这有帮助,请告诉我。

    【讨论】:

      【解决方案2】:

      你总是可以试试这个:

      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;
                  }
              }
          }
      } 
      

      【讨论】:

        【解决方案3】:

        创建两个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>
        

        【讨论】:

        • 明天肯定会测试这个。当前的解决方案是带有可用按钮和复选框的数据模板。然后它们共享一个视图类而不是子类,然后共享两个逆属性来检查每种“实例”。使用可见性来显示/隐藏它们。不是一个优雅的解决方案,但目前有效。明天将检查您的解决方案,谢谢。
        • 刚试过这个。在 DataGrid 上我有一个 ItemsSource,那么我应该在 中写什么?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多