C# WPF binding选择DataGridComboxColumn的编辑绑定
我有一个学生类,它定义了学生的属性,如下所示C# WPF binding选择DataGridComboxColumn的编辑绑定,c#,wpf,datagrid,datagridcomboboxcolumn,C#,Wpf,Datagrid,Datagridcomboboxcolumn,我有一个学生类,它定义了学生的属性,如下所示 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 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;
}
}
公共类国家
{
公共静态ObservableCollection{get;}=new ObservableCollection()
{
“阿富汗”,
“阿尔巴尼亚”,
“阿尔及利亚”,
“安道尔”,
“安哥拉”,
“安圭拉”,
“安提瓜和巴布达”,
“阿根廷”,
“亚美尼亚”,
“澳大利亚”,
“奥地利”,
“阿塞拜疆”,
“巴哈马”,
“巴林”,
“孟加拉国”,
“巴巴多斯”,
“白俄罗斯”,
“比利时”,
“伯利兹”,
“贝宁”,
“百慕大”,
“不丹”,
“玻利维亚”,
“波斯尼亚和黑塞哥维那”,
“博茨瓦纳”,
“巴西”,
}
在我的视图模型中,我声明了一个可观察的集合,该集合初始化为国家列表
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;
}
}
public类ViewModel:BaseViewModel
{
公共可观测集合{get;private set;}
公共视图模型()
{
//设置国籍列表
国籍=国家。国籍;
}
}
现在我创建了DataGridComboxColumn,如下所示
<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列包含所有国家/地区,但当我选择某个特定国家/地区时,它不会显示出来。我在网上看到过类似的问题,但我没有看到任何适用于我的问题的答案。有什么建议吗?我认为你需要在
学生上实现INotifyPropertyChanged
界面颂歌>
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));
}
}
}
假设DataGrid
的ItemsSource
是IEnumerable
您应该绑定到national
而不是Student.national
:
<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>
您可以使用DataGridTemplateColumn来实现相同的功能,而不是使用DataGridComboxColumn。您可能需要编写一些代码来维护文本框和comboBox的样式
<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>
谢谢。我在BaseViewModel类中实现了它。ComboBoxColumn的问题是它根本不显示选定的值。我认为它与DAtaGridComboBoxColumn@KenJanka:是否尝试过此操作?或者重命名绑定路径失败?