[英]Setting the SelectedItemBinding on a DataGridComboBoxColumn
[英]WPF binding SelectedItemBinding of a 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 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包含所有國家/地區,但是當我選擇一個特定國家/地區時,不會顯示該信息。我在網上看到了類似的問題,但沒有看到任何適合我的情況的答案。 有什么建議么?
除了使用DataGridComboBoxColumn,還可以使用DataGridTemplateColumn來實現相同的目的。 您可能必須編寫一些代碼來維護文本框和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>
我認為您需要在Student
上實現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<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>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.