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:是否尝试过此操作?或者重命名绑定路径失败?