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