Search code examples
c#wpfbindingdatagridtemplatecolumn

WPF DataGrid how to set ColumnType to different type based on bound data?


I have "Preferences" data structure where I have string "Value" field and enum for "Type" field.

Type can be 0-Boolean, 1-Integer, 2-String ...

Depending on value in this Type field I'd like to display "Value" cell different way Checkbox, Textbox, dropdown, etc. So, to make it clear - same column should display different cells depending on data in that row..

I guess I need to employ DataGridTemplateColumn but I never did that and would like some example if possible.

Also, what can I do with XAML and what needs to be done in Code? I guess Value converter will have to be used as well?


Solution

  •            <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>
    

    In CodeBehind you have a ObservableCollection Items {get;set;}

    public class SimpleClass { public TypeEnum ItemType{get;set;} public object Value {get;set;} }