WPF DataGrid DataGridTemplateColumn

WPF DataGrid DataGridTemplateColumn,wpf,xaml,binding,datagrid,combobox,Wpf,Xaml,Binding,Datagrid,Combobox,我试图在datagrid上显示一个人的姓名和性别。用户应该能够输入姓名并从组合框中选择性别。我希望combobox始终可见,所以我使用DataGridTemplateColumn。然而,每当我向列表中添加新的人时,combobox上并没有显示性别,但我确信它已经设置好了。但若我从combobox中选择任何内容,将显示选择,并且模型上的数据将被更新。有什么能让这一切顺利吗?注意:我使用的是Caliburn 我的看法是: <Window x:Class="WpfPetApp.ShellView

我试图在datagrid上显示一个人的姓名和性别。用户应该能够输入姓名并从组合框中选择性别。我希望combobox始终可见,所以我使用DataGridTemplateColumn。然而,每当我向列表中添加新的人时,combobox上并没有显示性别,但我确信它已经设置好了。但若我从combobox中选择任何内容,将显示选择,并且模型上的数据将被更新。有什么能让这一切顺利吗?注意:我使用的是Caliburn

我的看法是:

<Window x:Class="WpfPetApp.ShellView"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="*"></RowDefinition>
            <RowDefinition Height="Auto"></RowDefinition>
            <RowDefinition Height="Auto"></RowDefinition>
        </Grid.RowDefinitions>
        <DataGrid x:Name="TestDataGrid" Grid.Row="0" ColumnWidth="*" HeadersVisibility="Column" SelectedItem="{Binding SelectedTestDataGrid, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
                        CanUserDeleteRows="False" 
                        CanUserAddRows="False" 
                        CanUserResizeColumns="False"
                        CanUserReorderColumns="False"
                        CanUserResizeRows="False"
                        CanUserSortColumns="True"
                        AutoGenerateColumns="False" 
                        SelectionMode="Single" >
            <DataGrid.Columns>
                <DataGridTextColumn Header="Name" Binding="{Binding Name, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"></DataGridTextColumn>
                <DataGridTemplateColumn>
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <ComboBox ItemsSource="{Binding ElementName=TestDataGrid, Path=DataContext.Sexes}" SelectedValue="{Binding Sex, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
            </DataGrid.Columns>
        </DataGrid>
        <Button x:Name="AddRow" Grid.Row="1">Add</Button>
    </Grid>
</Window>
和一个应用程序屏幕:


任何帮助都将不胜感激。

由于
SelectedValue
指的是完全不同的实例,因此在添加行时未选择任何项目

我不知道为什么每次访问
Sex.Male
Sex.Male
时,您总是返回新实例。因此,当设置ItemsSource时,会添加新的男性和女性实例,当您添加行时,会返回男性/女性的新实例,这在ItemSource中不存在,因此不会选择任何项目


将Sex属性设置为组合框中已添加的实例,如下所示:

TestDataGrid.Add(new Person { Name = Guid.NewGuid().ToString(),
                              Sex = (male ? Sexes.First() : Sexes.Last()) });

始终从男/女返回相同的实例:

public class Sex
{
    private static Sex male = new Sex(MaleSexId);
    public static Sex Male
    {
        get
        {

            return male;
        }
    }

    private static Sex female = new Sex(FemaleSexId);
    public static Sex Female
    {
        get
        {
            return female;
        }
    }

    .....
}
理想情况下,
Sex
应该是Enum,不需要为它设置类

public enum Sex
{
   Male,
   Female
}

这是一个非常愚蠢的错误。我认为静态getter每次都会返回相同的实例。谢谢你纠正我。Sex类是唯一一个了解datagrid绑定的简单示例。在real应用程序中,我使用的是更复杂的类。
public class Sex
{
    private static Sex male = new Sex(MaleSexId);
    public static Sex Male
    {
        get
        {

            return male;
        }
    }

    private static Sex female = new Sex(FemaleSexId);
    public static Sex Female
    {
        get
        {
            return female;
        }
    }

    .....
}
public enum Sex
{
   Male,
   Female
}