C# WPF ComboBox无法显示Skola类naziv字段值,绑定问题求助
解决WPF ComboBox绑定Skola类名称不显示的问题
问题根源
当前代码存在三个核心问题导致ComboBox无法正常显示学校名称:
skole是私有字段,WPF数据绑定仅能访问公共成员- ComboBox未指定要显示的属性路径(
DisplayMemberPath) Skola类未完整实现INotifyPropertyChanged接口的事件触发逻辑
具体修复步骤
1. 完善Skola类的INotifyPropertyChanged实现
补充事件触发方法,确保属性变更时能通知UI更新:
internal class Skola : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; private int ID; private string naziv; private string adresa; private string slika; private ObservableCollection<Ucenik> ucenici; public Skola() { } public Skola(int ID, string naziv, string adresa, string slika) { this.ID = ID; this.naziv = naziv; this.adresa = adresa; this.slika = slika; ucenici = new ObservableCollection<Ucenik>(); } public string Naziv { get { return naziv; } set { if (naziv != value) { naziv = value; NotifyPropertyChanged(nameof(Naziv)); } } } // 新增事件触发方法 private void NotifyPropertyChanged(string propertyName) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } }
2. 将主窗口的skole字段改为公共属性
WPF绑定无法访问私有成员,需修改为公共属性:
public partial class MainWindow : Window { // 改为公共属性 public ObservableCollection<Skola> skole { get; private set; } private Skola NEUPISANI = new Skola(0, "", "", ""); private Skola selected_skolice = new Skola(); public MainWindow() { InitializeComponent(); skole = new ObservableCollection<Skola>(); Skola s1 = new Skola(1, "Jozef Atila", "Sarplaninska 8", ""); Skola s2 = new Skola(2, "Bogdana Saputa", "Nardonog fronta 14", ""); s1.dodajUcenikaTest(new Ucenik("0021233213", "Milan", "Reljin", "Radnicka 12", "")); s2.dodajUcenikaTest(new Ucenik("034321233213", "Dragan", "Markovic", "Crnacka 33", "")); skole.Add(s1); skole.Add(s2); skole.Add(NEUPISANI); DataContext = this; } }
3. 给ComboBox指定要显示的属性路径
修改XAML,通过DisplayMemberPath告诉控件显示Skola对象的Naziv属性:
<ComboBox x:Name="skolice" Margin="180 10 180 30" Grid.ColumnSpan="2" ItemsSource="{Binding Path=skole}" DisplayMemberPath="Naziv" SelectionChanged="skolice_SelectionChanged"></ComboBox>
如果需要自定义显示样式,也可以用ItemTemplate替代:
<ComboBox x:Name="skolice" Margin="180 10 180 30" Grid.ColumnSpan="2" ItemsSource="{Binding Path=skole}" SelectionChanged="skolice_SelectionChanged"> <ComboBox.ItemTemplate> <DataTemplate> <TextBlock Text="{Binding Naziv}"/> </DataTemplate> </ComboBox.ItemTemplate> </ComboBox>
额外提示
如果非英文命名影响代码可读性,可统一改为英文命名(如Skola→School、Naziv→Name),但并非强制要求。
内容的提问来源于stack exchange,提问作者StraleS02
相关产品推荐
相关产品推荐

