You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 23:45:28