C# DataGrid中的组合框,最初为空(从数据库加载内容)

C# DataGrid中的组合框,最初为空(从数据库加载内容),c#,wpf,xaml,combobox,datagrid,C#,Wpf,Xaml,Combobox,Datagrid,我有个问题。我有一个带有空数据网格的选项卡。当程序启动时,datagrid将充满来自数据库的数据。您可以编辑它,然后按名为“Opslaan”(荷兰语表示保存)的按钮保存它。问题是,在“Bestellingen”选项卡上有一个名为“State”的字段,其中的状态为“Delivered”、“Sent”、“Processing”。因此,我希望这个特定字段像一个组合框,因为现在用户必须输入其中一种状态,如果用户输入错误,他会得到一个错误,使用组合框,用户体验将得到增强。有人能给我解释一下我是如何做到这一

我有个问题。我有一个带有空数据网格的选项卡。当程序启动时,datagrid将充满来自数据库的数据。您可以编辑它,然后按名为“Opslaan”(荷兰语表示保存)的按钮保存它。问题是,在“Bestellingen”选项卡上有一个名为“State”的字段,其中的状态为“Delivered”、“Sent”、“Processing”。因此,我希望这个特定字段像一个组合框,因为现在用户必须输入其中一种状态,如果用户输入错误,他会得到一个错误,使用组合框,用户体验将得到增强。有人能给我解释一下我是如何做到这一点的吗

<Window x:Class="SFES.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:SFES"
    mc:Ignorable="d"
    Title="Super Fontys Entertainment System" Height="396.563" Width="711.25" WindowState="Maximized">
<Grid>
    <TabControl x:Name="tabControl" Margin="0,0,0.4,-0.2">
        <TabItem Header="Klanten">
            <Grid Background="#FFE5E5E5">
                <DataGrid x:Name="KlantenDataGrid" ItemsSource="{Binding }" Margin="0,19,0.4,0.4"/>
                <Button x:Name="KlantenOpslaan" Content="Opslaan" HorizontalAlignment="Left" VerticalAlignment="Top" Width="75" Click="KlantenOpslaan_Click"/>
            </Grid>
        </TabItem>
        <TabItem Header="Bestellingen">
            <Grid Background="#FFE5E5E5">
                <DataGrid x:Name="BestellingenDataGrid" ItemsSource="{Binding }" Margin="0,19,0.4,0.4"/>
                <Button x:Name="OpslaanBestellingen" Content="Opslaan" HorizontalAlignment="Left" VerticalAlignment="Top" Width="75" Click="OpslaanBestellingen_Click"/>
            </Grid>
        </TabItem>
        <TabItem Header="Spelers">
            <Grid Background="#FFE5E5E5">
                <DataGrid x:Name="SpelersDataGrid" ItemsSource="{Binding }" Margin="0,19,0.4,0.4"/>
                <Button x:Name="SpelersOpslaan" Content="Opslaan" HorizontalAlignment="Left" VerticalAlignment="Top" Width="75" Click="SpelersOpslaan_Click"/>
            </Grid>
        </TabItem>
        <TabItem Header="Leveranciers">
            <Grid Background="#FFE5E5E5">
                <DataGrid x:Name="LeveranciersDataGrid" ItemsSource="{Binding }" Margin="0,19,0.4,0.4"/>
                <Button x:Name="LeveranciersOpslaan" Content="Opslaan" HorizontalAlignment="Left" VerticalAlignment="Top" Width="75" Click="LeveranciersOpslaan_Click"/>
            </Grid>
        </TabItem>
        <TabItem Header="Highscores">
            <Grid Background="#FFE5E5E5">
                <DataGrid x:Name="HighscoresDataGrid" ItemsSource="{Binding }" Margin="0,19,0.4,0.4"/>
                <Button x:Name="HighscoresOpslaan" Content="Opslaan" HorizontalAlignment="Left" VerticalAlignment="Top" Width="75" Click="HighscoresOpslaan_Click"/>
            </Grid>
        </TabItem>
        <TabItem Header="Spellen">
            <Grid Background="#FFE5E5E5">
                <DataGrid x:Name="SpellenDataGrid" ItemsSource="{Binding }" Margin="0,19,0.4,0.4"/>
                <Button x:Name="OpslaanSpellen" Content="Opslaan" HorizontalAlignment="Left" VerticalAlignment="Top" Width="75" RenderTransformOrigin="0.504,0.541" Click="OpslaanSpellen_Click"/>
            </Grid>
        </TabItem>
    </TabControl>

</Grid>

在XAML中,需要声明一个组合框类型的列,如下所示:

<DataGridComboBoxColumn Header="State" SelectedItemBinding="{Binding States}">
  <DataGrid.Columns>
    <DataGridComboBoxColumn.ElementStyle>
        <Style TargetType="ComboBox">
            <Setter Property="ItemsSource" Value="{Binding States}"/>
            <Setter Property="IsReadOnly" Value="True"/>
        </Style>
    </DataGridComboBoxColumn.ElementStyle>
</DataGridComboBoxColumn>
从datareader读取数据后,需要创建上述类

<DataGridComboBoxColumn Header="State" SelectedItemBinding="{Binding States}">
  <DataGrid.Columns>
    <DataGridComboBoxColumn.ElementStyle>
        <Style TargetType="ComboBox">
            <Setter Property="ItemsSource" Value="{Binding States}"/>
            <Setter Property="IsReadOnly" Value="True"/>
        </Style>
    </DataGridComboBoxColumn.ElementStyle>
</DataGridComboBoxColumn>
public class GridData
{
    public DataTable Table { get; set; }

    // for the combobox see the property name. This is also in XAML above
    public List<string> States {get; set; } 
}