Can Datagrid column contain diffterent type of control in different row

前端 未结 2 707
陌清茗
陌清茗 2021-02-09 11:15

In Wpf, Can I create a datagrid which different row contain different type of control in same column?

For easiest case: datagrid with 5 cols, 2 rows, don\'t care about 4

相关标签:
2条回答
  • 2021-02-09 11:59

    Yes, you can. You need to create a template for your column.

    See this: WPF DataGrid different edit controls within a single column

    0 讨论(0)
  • 2021-02-09 12:12

    You can use a DataGridTemplateColumn combined with a few triggers to achieve this functionality.

    This is a demo application that binds a DataGrid to a list of (string) Control Types. The first column just displays the control type string, and the second column acts on the same information to present the corresponding Control. You might be able to make the xaml a bit more concise, but this is the jist of it:

    The XAML:

    <Window x:Class="DataGridWithMultipleTypesPerColumn.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <DataGrid ItemsSource="{Binding ControlTypes}"
                  AutoGenerateColumns="False">
            <DataGrid.Columns>
            <DataGridTextColumn Header="Control Type" Binding="{Binding}"/>
                <DataGridTemplateColumn Header="Actual Control">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <ContentControl>
                                <ContentControl.Style>
                                    <Style TargetType="ContentControl">
                                        <Style.Triggers>
                                            <DataTrigger Binding="{Binding}" Value="TextBox">
                                                <Setter Property="ContentTemplate">
                                                    <Setter.Value>
                                                        <DataTemplate>
                                                            <TextBox Text="Default Text"/>
                                                        </DataTemplate>
                                                    </Setter.Value>
                                                </Setter>
                                            </DataTrigger>
                                            <DataTrigger Binding="{Binding}" Value="CheckBox">
                                                <Setter Property="ContentTemplate">
                                                    <Setter.Value>
                                                        <DataTemplate>
                                                            <CheckBox Content="Check Box"/>
                                                        </DataTemplate>
                                                    </Setter.Value>
                                                </Setter>
                                            </DataTrigger>
                                            <DataTrigger Binding="{Binding}" Value="Button">
                                                <Setter Property="ContentTemplate">
                                                    <Setter.Value>
                                                        <DataTemplate>
                                                            <Button Content="Button"/>
                                                        </DataTemplate>
                                                    </Setter.Value>
                                                </Setter>
                                            </DataTrigger>
                                        </Style.Triggers>
                                    </Style>
                                </ContentControl.Style>
                            </ContentControl>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
            </DataGrid.Columns>
        </DataGrid>
    </Grid>
    

    Code-behind and View Model:

    namespace DataGridWithMultipleTypesPerColumn
    {
        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
                this.DataContext = new ViewModel();
            }
        }
    
        public class ViewModel
        {
            public ObservableCollection<string> ControlTypes
            {
                get;
                private set;
            }
            public ViewModel()
            {
                ControlTypes = new ObservableCollection<string>() { "Button", "TextBox", "CheckBox" };
            }
        }
    }
    
    0 讨论(0)
提交回复
热议问题