使用DisplayMemberPath将自定义类绑定到WPF ComboBox

时间:2016-05-17 15:05:41

标签: c# wpf xaml data-binding combobox

我知道这是基本的,但我正在从vb.net跳转到C#,而我在vb.net中使用的方法似乎并没有起作用。 我已经使用自定义类服务创建了一个.dll 在我的项目中,我使用Service实例填充ObservableCollection。我想在XAML(WPF)中使用DisplayMemberPath在组合框中显示实例。

我的服务实例正在填充ComboBox,但每个项目的显示为空白;我只是得到一堆空行可供选择。

我已经尝试过在课堂上实施INotifyPropertyChanged并且没有在课堂上实施INotifyPropertyChanged,虽然我不认为此时应该是必要的,因为我还是在1号方面。

这是我的代码:

      <Grid>
        <ComboBox Name="TopService"
                        VerticalAlignment="Top"
                        ItemsSource="{Binding}"
                        DisplayMemberPath="{Binding ServCode}"></ComboBox>
      </Grid>

这是我的代码背后:

        public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        Execute();
    }
    private void Execute()
    {
        SA.franchiseID = "HOL010";
        ObservableCollection<Service> ocService = Service.InitializeServiceList();
        TopService.DataContext = ocService;
    }
}

该类的代码(通过.dll引用)

    public class Service : INotifyPropertyChanged
{
    #region INotifyPropertyChanged implementation
    public event PropertyChangedEventHandler PropertyChanged;
    protected void Notify(string propertyName)
    {
        if (this.PropertyChanged != null)
        { PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); }
    }
    #endregion
    private string servCode;
    public string ServCode
    {
        get { return servCode; }
        set { servCode = value; Notify("ServCode"); }
    }
    public string programCode = "";
    public int roundNum = 0;
    public static ObservableCollection<Service> InitializeServiceList()
    {
        ObservableCollection<Service> oc = new ObservableCollection<Service>();
        using (SA s = new SA())
        {
            s.SqlString = @"select 
ps.serv_code
,pc.prgm_code
,ps.round
from prgmserv as ps 
inner join prgmcd as pc on pc.progdefid = ps.progdefid
where pc.available = 1";
            s.reader = s.command.ExecuteReader();
            Service newService;
            while (s.reader.Read())
            {
                newService = new Service();
                newService.servCode = s.reader["serv_code"].ToString();
                newService.programCode = s.reader["prgm_code"].ToString();
                newService.roundNum = Convert.ToInt32(s.reader["round"].ToString());
                oc.Add(newService);
                newService = null;
            }
            return oc;
        }
    }
}

2 个答案:

答案 0 :(得分:6)

DisplayMemberPath is a string。你不能赋予它对财产的约束力;你只需给它一个属性的路径,然后通过反射查找它。

试试这个:

DisplayMemberPath="ServCode"

您正在做的事情会使ServCode用作DisplayMemberPath;如果ServCode是12,它会在组合框中的每个项目上寻找一个名为12的属性 - 不是你的意图,我确定。

答案 1 :(得分:1)

我在尝试将项目绑定到ItemsControl时也意识到,Field和Property之间的区别变得非常重要。我一直试图绑定到Fields,这是行不通的。这在技术上与VB.net没有什么不同。但是VB.net中隐式定义的属性看起来非常像C#中的Field。所有这一切,我相信我现在准备好征服世界了!