Задача такая: Имеется форма с двумя комбобоксами, отображающими список объектов одинакового типа (Person). На форме лежат два ObjectBinder компонента. Один для связывания списка комбобокса со списком объектов Person (один и тот же ObjectBinder используется как DataSource двух контролов), второй для связывания свойств рабочего объекта Marriage со значениями контролов на форме.
Почему-то первый ObjectBinder связывает не только списки контролов со списком объектов, но также и выбранные значения контролов, т.е. при выборе значения в одном контроле, второй контрол тоже изменяет значение. Мне кажется, что такое поведение ObjectBinder неверно. Не должен ObjectBinder, установленный как DataSource у ряда контролов, связывать также выбранные значения этих контролов.
Вот такой код:
using System;
using System.ComponentModel;
using System.Windows.Forms;
using BLToolkit.ComponentModel;
using BLToolkit.EditableObjects;
namespace ObjectBinderTest
{
public class MarriageForm : Form
{
private ObjectBinder obWorkingObject;
private ObjectBinder obReferenceObject;
private Label lblHusband;
private Label lblWife;
private ComboBox cmbHusband;
private ComboBox cmbWife;
private IContainer components;
public MarriageForm()
{
InitializeComponent();
PersonList personList = new PersonList();
personList.Add(new Person(1, "Foo"));
personList.Add(new Person(2, "Bar"));
obReferenceObject.List = personList;
obWorkingObject.Object = new Marriage();
}
/// <summary>
/// Clean up any resources being used.
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
this.obWorkingObject = new BLToolkit.ComponentModel.ObjectBinder(this.components);
this.obReferenceObject = new BLToolkit.ComponentModel.ObjectBinder(this.components);
this.cmbHusband = new System.Windows.Forms.ComboBox();
this.cmbWife = new System.Windows.Forms.ComboBox();
this.lblHusband = new System.Windows.Forms.Label();
this.lblWife = new System.Windows.Forms.Label();
this.SuspendLayout();
//
// obWorkingObject
//
this.obWorkingObject.ItemType = typeof(ObjectBinderTest.Marriage);
//
// obReferenceObject
//
this.obReferenceObject.ItemType = typeof(ObjectBinderTest.Person);
//
// cmbHusband
//
this.cmbHusband.DataBindings.Add(new System.Windows.Forms.Binding("SelectedValue", this.obWorkingObject, "HusbandId"));
this.cmbHusband.DataSource = this.obReferenceObject;
this.cmbHusband.DisplayMember = "Name";
this.cmbHusband.Location = new System.Drawing.Point(120, 56);
this.cmbHusband.Name = "cmbHusband";
this.cmbHusband.Size = new System.Drawing.Size(121, 21);
this.cmbHusband.TabIndex = 0;
this.cmbHusband.ValueMember = "Id";
//
// cmbWife
//
this.cmbWife.DataBindings.Add(new System.Windows.Forms.Binding("SelectedValue", this.obWorkingObject, "WifeId"));
this.cmbWife.DataSource = this.obReferenceObject;
this.cmbWife.DisplayMember = "Name";
this.cmbWife.Location = new System.Drawing.Point(120, 104);
this.cmbWife.Name = "cmbWife";
this.cmbWife.Size = new System.Drawing.Size(121, 21);
this.cmbWife.TabIndex = 1;
this.cmbWife.ValueMember = "Id";
//
// lblHusband
//
this.lblHusband.Location = new System.Drawing.Point(16, 56);
this.lblHusband.Name = "lblHusband";
this.lblHusband.TabIndex = 2;
this.lblHusband.Text = "Husband";
//
// lblWife
//
this.lblWife.Location = new System.Drawing.Point(16, 104);
this.lblWife.Name = "lblWife";
this.lblWife.TabIndex = 3;
this.lblWife.Text = "Wife";
//
// MarriageForm
//
this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
this.ClientSize = new System.Drawing.Size(292, 273);
this.Controls.Add(this.lblWife);
this.Controls.Add(this.lblHusband);
this.Controls.Add(this.cmbWife);
this.Controls.Add(this.cmbHusband);
this.Name = "MarriageForm";
this.Text = "MarriageForm";
this.ResumeLayout(false);
}
#endregion
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.Run(new MarriageForm());
}
}
public class Person : EditableObject
{
public Person(){}
public Person(int id, string name)
{
Id = id;
Name = name;
}
public int Id;
public string Name;
}
public class PersonList : EditableArrayList
{
public PersonList()
: base(typeof(Person))
{}
public new Person this[int index]
{
get { return (Person)base[index]; }
set { base [index] = value; }
}
}
public class Marriage : EditableObject
{
public int HusbandId;
public int WifeId;
}
}
С уважением. selfmade.