WPF DataGrid, как установить ColumnType другого типа на основе связанных данных? - PullRequest
7 голосов
/ 08 июля 2011

У меня есть структура данных «Предпочтения», где у меня есть строковое поле «Значение» и перечисление для поля «Тип».

Тип может быть 0-Boolean, 1-Integer, 2-String ...

В зависимости от значения в этом поле Тип, я бы хотел, чтобы ячейка «Значение» отображалась по-разному. Флажок, Текстовое поле, раскрывающийся список и т. Д. Итак, для ясности - в одном столбце должны отображаться разные ячейки в зависимости от данных в этомrow ..

Полагаю, мне нужно использовать DataGridTemplateColumn, но я никогда этого не делал и хотел бы привести пример, если это возможно.

Кроме того, что я могу сделать с XAML и что нужно сделать в коде?Я думаю, что конвертер значений тоже нужно будет использовать?

1 Ответ

9 голосов
/ 08 июля 2011
           <DataGrid ItemsSource="{Binding Items,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" >
            <DataGrid.Columns>
                <DataGridTemplateColumn>
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <ContentControl x:Name="content" Content="{Binding}" >
                            </ContentControl>
                            <DataTemplate.Triggers>
                                <DataTrigger Binding="{Binding ItemType}" Value="0">
                                    <Setter TargetName="content" Property="ContentTemplate">
                                        <Setter.Value>
                                            <DataTemplate>
                                                <CheckBox IsChecked="{Binding Value,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"></CheckBox>
                                            </DataTemplate>
                                        </Setter.Value>
                                    </Setter>
                                </DataTrigger>
                                <DataTrigger Binding="{Binding ItemType}" Value="1">
                                    <Setter TargetName="content" Property="ContentTemplate">
                                        <Setter.Value>
                                            <DataTemplate>
                                                <TextBox Text="{Binding Value,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"></TextBox>
                                            </DataTemplate>
                                        </Setter.Value>
                                    </Setter>
                                </DataTrigger>
                            </DataTemplate.Triggers>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
            </DataGrid.Columns>
        </DataGrid>

В CodeBehind есть элементы ObservableCollection {get; set;}

открытый класс SimpleClass {public TypeEnum ItemType {get; set;} открытый объект Value {get; set;}}

...