具有组合框详细信息的主详细信息数据绑定[WinForms]

具有组合框详细信息的主详细信息数据绑定[WinForms],winforms,data-binding,Winforms,Data Binding,尝试设置一个主细节场景,其中细节将有一个组合框。是否有方法使用纯数据绑定使每个细节项保留其选择,或者是否有一些手动管道需要在此处完成 以下示例的重新创建步骤: 将M1的详细信息更改为“详细信息2” 切换到主M2,然后返回到M1 “详细信息”返回到“详细信息1”。我希望它保留以前选择的值 表单构造函数: InitializeComponent (); List<MasterData> dataList = new List<MasterData> (); dataLis

尝试设置一个主细节场景,其中细节将有一个组合框。是否有方法使用纯数据绑定使每个细节项保留其选择,或者是否有一些手动管道需要在此处完成

以下示例的重新创建步骤:

  • 将M1的详细信息更改为“详细信息2”
  • 切换到主M2,然后返回到M1
  • “详细信息”返回到“详细信息1”。我希望它保留以前选择的值
  • 表单构造函数:

    InitializeComponent ();
    
    List<MasterData> dataList = new List<MasterData> ();
    
    dataList.Add (new MasterData ("M1"));
    dataList.Add (new MasterData ("M2"));
    
    // master data
    this.masterBindingSource.DataSource = typeof (MasterData);
    this.masterBindingSource.DataSource = dataList;
    
    this.masterComboBox.DataSource = this.masterBindingSource;
    this.masterComboBox.DisplayMember = "Name";
    
    // details                    
    this.detailsBindingSource.DataMember = "Details";
    this.detailsBindingSource.DataSource = this.masterBindingSource;
    
    this.detailsComboBox.DataBindings.Add (new System.Windows.Forms.Binding ("SelectedValue", this.masterBindingSource,
        "SelectedDetail", true));
    
    this.detailsComboBox.DataSource = this.detailsBindingSource;
    this.detailsComboBox.DisplayMember = "Name";
    
    // Label to make sure the master is actually changing
    this.detailLabel.DataBindings.Add (new System.Windows.Forms.Binding ("Text", this.masterBindingSource, 
        "Name", true, DataSourceUpdateMode.OnPropertyChanged));
    
    InitializeComponent();
    List dataList=新列表();
    添加(新主数据(“M1”);
    数据列表。添加(新主数据(“M2”);
    //主数据
    this.masterBindingSource.DataSource=typeof(MasterData);
    this.masterBindingSource.DataSource=dataList;
    this.masterComboBox.DataSource=this.masterBindingSource;
    this.masterComboBox.DisplayMember=“Name”;
    //细节
    this.detailsBindingSource.DataMember=“Details”;
    this.detailsBindingSource.DataSource=this.masterBindingSource;
    this.detailsComboBox.DataBindings.Add(新System.Windows.Forms.Binding(“SelectedValue”),this.masterBindingSource,
    “选定细节”,正确);
    this.detailsComboBox.DataSource=this.detailsBindingSource;
    this.detailsComboBox.DisplayMember=“Name”;
    //标签,以确保主控形状实际上正在更改
    this.detailLabel.DataBindings.Add(新的System.Windows.Forms.Binding(“Text”),this.masterBindingSource,
    “Name”,true,DataSourceUpdateMode.OnPropertyChanged);
    
    数据:

    公共类详细信息
    {
    公共字符串名称{get;set;}
    公共详细信息(字符串名称)
    {
    this.Name=Name;
    }
    }
    公共类主数据
    {
    公共字符串名称{get;set;}
    公共列表详细信息{get;set;}
    公共详细信息已选择详细信息{get;set;}
    公共主数据(字符串名称)
    {
    this.Details=newlist();
    this.Name=Name;
    this.Details.Add(新细节(“Detail1”);
    this.Details.Add(新细节(“细节2”));
    this.SelectedDetail=this.Details.FirstOrDefault();
    }
    }
    

    我来自WPF背景,正在努力理解WinForms中的绑定,希望这一切都有意义。

    您的解释有点混乱。你能从控件的角度解释一下吗?@jcwrets这就是winforms的问题所在,在WPF中,用户界面是通过对它的抽象(视图模型)和数据绑定来实现的,没有“控件”就无法真正设计用户界面。winforms的数据绑定是一个荒谬的笑话,不允许任何这种情况发生。@kbeal2k为什么要倒退?winforms是一项没有人关心的非常古老的技术。如果您已经了解WPF,为什么不使用它呢?Winforms在其可能的绑定上有自己的位置,它只是没有WPF那么健壮。我一直使用WinForms,并且能够使用MVVM,但我使用RX框架和绑定。
    public class Details
    {
        public String Name { get; set; }
    
        public Details (string name)
        {
            this.Name = name;
        }
    }
    
    public class MasterData
    {
        public String Name { get; set; }
        public List<Details> Details { get; set; }
        public Details SelectedDetail { get; set; }
    
        public MasterData (string name)
        {
            this.Details = new List<Details> ();
            this.Name = name;
    
            this.Details.Add (new Details ("Detail1"));
            this.Details.Add (new Details ("Detail2"));
            this.SelectedDetail = this.Details.FirstOrDefault ();
        }
    }