我有一个学生班,定义学生的属性如下
public class Student
{
public string Department { get; set; }
public string Level { get; set; }
public Gender Gender { get; set; }
public string Nationality { get; set; }
}
我有另一个类,其中包含声明如下所示的集合中的国家/地区列表
public class Countries
{
public static ObservableCollection<string> Nationalities { get; } = new ObservableCollection<string>()
{
"Afghanistan",
"Albania",
"Algeria",
"Andorra",
"Angola",
"Anguilla",
"Antigua & Barbuda",
"Argentina",
"Armenia",
"Australia",
"Austria",
"Azerbaijan",
"Bahamas",
"Bahrain",
"Bangladesh",
"Barbados",
"Belarus",
"Belgium",
"Belize",
"Benin",
"Bermuda",
"Bhutan",
"Bolivia",
"Bosnia & Herzegovina",
"Botswana",
"Brazil",
}
在我的视图模型中,我声明了一个可观察的集合,该集合初始化为国家/地区列表。这是在视图模型的构造函数中完成的,如下所示
public class ViewModel : BaseViewModel
{
public ObservableCollection<string> Nationalities { get; private set; }
public ViewModel()
{
// Set the nationality list
Nationalities = Countries.Nationalities;
}
}
现在我已经创建了我的DataGridComboBoxColumn,
<DataGrid.Columns>
<DataGridComboBoxColumn Width="Auto"
SelectedItemBinding="{Binding Path=Student.Nationality}"
Header="Nationality"
x:Name="NationalityComboBox2">
<DataGridComboBoxColumn.EditingElementStyle>
<Style TargetType="ComboBox">
<Setter Property="ItemsSource" Value="{Binding Path=DataContext.Nationalities, ElementName=StudentListGrid}" />
</Style>
</DataGridComboBoxColumn.EditingElementStyle>
</DataGridComboBoxColumn>
</DataGrid.Columns>
当我运行我的应用程序时,DataGridComboBoxColumn包含所有国家/地区,但是当我选择某个特定国家/地区时,它没有显示。我在网上看到了类似的问题,但我没有看到任何适用于我的情况的答案。有什么建议吗?
答案 0 :(得分:1)
您可以使用DataGridTemplateColumn来实现相同的功能,而不是使用DataGridComboBoxColumn。您可能必须编写一些代码来维护文本框和组合框的样式。
<DataGridTemplateColumn Header="Nationality" >
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Nationality}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<ComboBox SelectedItem="{Binding Nationality}" ItemsSource="{Binding Path=DataContext.Nationalities, ElementName=StudentListGrid}"/>
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
答案 1 :(得分:0)
我认为您需要在INotifyPropertyChanged
Student
界面
public class Student : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public string Department { get; set; }
public string Level { get; set; }
public Gender Gender { get; set; }
private string _nationality;
public string Nationality
{
get
{
return _nationality;
}
set
{
if(value != _nationality)
{
_nationality = value;
OnPropertyChanged(nameof(Nationality));
}
}
}
protected void OnPropertyChanged(string name)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(name));
}
}
}
答案 2 :(得分:0)
假设DataGrid
的{{1}}是IEnumerable<Student>
,您应该绑定到Nationality
而不是Student.Nationality
:
<DataGridComboBoxColumn Width="Auto"
SelectedItemBinding="{Binding Nationality}"
Header="Nationality"
x:Name="NationalityComboBox2">
<DataGridComboBoxColumn.EditingElementStyle>
<Style TargetType="ComboBox">
<Setter Property="ItemsSource" Value="{Binding Path=DataContext.Nationalities, ElementName=StudentListGrid}" />
</Style>
</DataGridComboBoxColumn.EditingElementStyle>
</DataGridComboBoxColumn>