Как изменить содержимое ячейки таблицы данных WPF в зависимости от типа объекта - PullRequest
1 голос
/ 09 сентября 2011

У меня есть коллекция, состоящая из двух разных типов объектов, с одинаковым базовым классом.подкласс A должен отображать кнопку в ячейке, а подкласс B должен отображать флажок в ячейке (тот же столбец).

Как мне сделать это в сетке данных wpf?

Ответы [ 3 ]

0 голосов
/ 09 сентября 2011

Вы всегда можете попробовать это:

ObservableCollection<MyBaseClass> myCollection = new ObservableCollection<MyBaseClass>;
myCollection.Add(new Subclass_A());
myCollection.Add(new Subclass_B());

...

Создайте шаблоны данных для каждого подкласса и подключите myCollection к DataGrid.На этом этапе у вас будет Grid, заполненный двумя типами (Subclass_A, Subclass_B).Волшебство заключается в использовании DataTemplateSelector в вашей DataGrid:

<DataGrid ItemTemplateSelector="{DynamicResource GridTemplateSelector}">

, имея это, Grid (на самом деле большинство контейнеров) будет запрашивать DataTemplate при рисовании элемента и применять соответственно.

0 голосов
/ 09 сентября 2011

Создайте два 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>
0 голосов
/ 09 сентября 2011

Приведенный ниже код приведен исключительно для ознакомления и не проверен для составления ...

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

Дайте мне знать, если это поможет.

...