【问题标题】:Binding Custom Object to WPF Combobox将自定义对象绑定到 WPF 组合框
【发布时间】:2015-04-19 19:25:18
【问题描述】:

我有一个组合框,其项目来源类型为 ObservableCollection<Clinic>

<ComboBox ItemsSource="{Binding Source={StaticResource ClinicList}}" DisplayMemberPath="Name" SelectedValue="{Binding Path=Name}" SelectedValuePath="Name"></ComboBox>

此组合框位于从 EmployeeClinics 绑定的 ListView 中。

public class Employee{
   public ObservableCollection<Clinic> EmployeeClinics { get; set; }
}

当我启动应用程序时,我会看到相应的诊所。下拉菜单似乎显示了正确的选项,但是当我更新它们时,只有名称更新而不是 ClinicId(它保留以前的 ClinicId)。

编辑:类似地,当我将一个新诊所添加到列表中并从选项中选择它时,当我查看该集合时,它的 Id 为 0。

这是我的诊所模型。

public class Clinic {
        public int ClinicId { get; set; }
        public string _name { get; set; }
        public string Name {
            get {

            return _name;}
            set {
                if (_name != value) {
                    _name = value;
                }
            }
        }
}

更新:感谢@AyyappanSubramanian。我正在取得进展。我已经更新了我的对象

public class Employee{
    public ObservableCollection<ClinicView> EmployeeClinics { get; set; }
}


public class ClinicView {

    private Clinic selectedClinic;
    public Clinic SelectedClinic {
        get { return selectedClinic; }
        set {
            selectedClinic = value;
            selectedClinicId = selectedClinic.ClinicId;
        }
    }

    private int selectedClinicId;
    public int SelectedClinicId {
        get { return selectedClinicId; }
    }
}

XAML:

<ComboBox ItemsSource="{Binding Source={StaticResource ClinicList}}" DisplayMemberPath="Name" SelectedItem="{Binding SelectedClinic}"></ComboBox>

现在更改下拉列表可以正确更改基础对象并根据需要更新列表。现在我唯一的问题是组合框不显示当前对象,只是在开始时显示为空白。我已经搞砸了 SelectedValue 和 Path 没有运气。有什么建议吗?

【问题讨论】:

  • 您能否发布模型和视图模型以重现您的问题。
  • 将绑定从 StaticResource 更改为 DynamicResource 会发生什么?
  • @AyyappanSubramanian 我已经更新了帖子。这有帮助吗?正如在 Fabio 的回答中一样,我已经发表了评论,并且可以让名称正确显示,但 ID 不会根据新选择进行更新。
  • 在组合框中添加 SelectedValuePath="ClinicId"
  • @AyyappanSubramanian 我发布了新的工作代码,显示它加载了正确的项目,我无法分配 selectedvaluepath 2x。如果我在那里没有名称,它将不再像显示的那样工作。

标签: wpf data-binding combobox


【解决方案1】:

参考下面的代码。您可以使用 SelectedItem 在一个 SelectedObject 中获取 ID 和名称。使用 SelectedValue 仅获取 ID。

 <ComboBox ItemsSource="{Binding Clinics}" DisplayMemberPath="ClinicName"
              SelectedValuePath="ClinicId" SelectedValue="{Binding SelectedClinicId}"                 
              SelectedItem="{Binding SelectedClinic}"/>


 public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        this.DataContext = new ViewModel();
    }        
}

class Clinic
{
    public int ClinicId { get; set; }
    public string ClinicName { get; set; }
}

class ViewModel
{
    public ObservableCollection<Clinic> Clinics { get; set; }
    public ViewModel()
    {
        Clinics = new ObservableCollection<Clinic>();
        for (int i = 0; i < 10; i++)
        {
            Clinics.Add(new Clinic() { ClinicId=i+1,ClinicName="MyClinic"+(i+1) });
        }
    }

    private int selectedClinicId;

    public int SelectedClinicId
    {
        get { return selectedClinicId; }
        set 
        { 
            selectedClinicId = value;
        }
    }


    private Clinic selectedClinic;

    public Clinic SelectedClinic
    {
        get { return selectedClinic; }
        set 
        { 
            selectedClinic = value;
            MessageBox.Show("ID:"+selectedClinic.ClinicId.ToString()+" "+"Name:"+selectedClinic.ClinicName);
        }
    }

}

【讨论】:

  • 我已经成功地让对象工作(它们在更改时链接)但组合框没有正确显示当前项目。有什么建议么?我已经用新信息更新了我的问题。它们在我选择一个后正确显示,但在此之前显示为空。
  • 等等,没有看到视图模型的其他部分。让我也更新一下
  • 是的,嗯,似乎无法让它们正确初始化。
  • 你已经回答了我的问题,尽管我同时遇到了一个新问题 :( 不过谢谢!
猜你喜欢
  • 1970-01-01
  • 2013-10-04
  • 1970-01-01
  • 2018-09-03
  • 2014-11-24
  • 2014-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多