Как связать источник данных со значением в другом источнике данных? - PullRequest
1 голос
/ 29 марта 2012

Я объясню проблему с примером в WinForms и C #:

class Foo { List<Bar> Bars { get; } ... }
class Bar { ... }
var foos = new List<Foo>();

Я начинаю с установки моего списка Foo s как источника данных для ListBox:

var fooListBox = new ListBox();
fooListBox.DataSource = foos;

Теперь я хочу иметь вторую ListBox, чей источник данных всегда является списком Bar с выбранных Foo (или null в противном случае).Концептуально:

var barListBox = new ListBox();
barListBox.DataSource = fooListBox.SelectedValue.Bars;

Есть ли простое решение этой проблемы?

В настоящее время я подключаю его вручную следующим образом:

barListBox.DataSource = fooListBox.SelectedValue != null ? ((Foo)fooListBox.SelectedValue).Bars : null;
fooListBox.SelectedValueChanged += (s,e) => barListBox.DataSource = fooListBox.SelectedValue != null ? ((Foo)fooListBox.SelectedValue).Bars : null;

Но я не могу не думать, что упускаю из виду что-то важное.

1 Ответ

2 голосов
/ 29 марта 2012

Вместо этого вы можете использовать BindingSource для синхронизации ваших объектов.

// first binding source that points to your List of Foos
BindingSource bindingSourceFoos = new BindingSource();
bindingSourceFoos.DataSource = foos;

// create a second binding source that references the first's Bars property
BindingSource bindingSourceBars = new BindingSource(bindingSourceFoos, "Bars");

// set DisplayMember to the property in class Foo you wish to display in your listbox
fooListBox.DisplayMember = "FooName"; // my example, replace with actual name
fooListBox.DataSource = bindingSourceFoos;

// again, set DisplayMember to the property in Bar that you want to display in ListBox
barListBox.DisplayMember = "BarInfo"; // my example, replace with actual name
barListBox.DataSource = bindingSourceBars;

Итак, с этого момента, когда вы нажимаете на что-то в FooListBox, оно автоматически изменитсясодержимое BarListBox для этой коллекции Foo's Bar.

Обновление:

MSDN - привязка данных к пользовательскому элементу управления

Эта ссылка должна рассказать вам всевам нужно знать, но на всякий случай:

Украсьте свой пользовательский элемент управления следующим образом:

[System.ComponentModel.LookupBindingProperties
  ("DataSource", "DisplayMember", "ValueMember", "LookupMember")]
public partial class FooSelector : UserControl, INotifyPropertyChanged

Добавьте эти элементы в свой пользовательский элемент управления:

    public object DataSource
    {
        get
        {
            return fooListBox.DataSource;
        }
        set
        {
            fooListBox.DataSource = value;
        }
    }

    public string DisplayMember
    {
        get { return fooListBox.DisplayMember; }
        set { fooListBox.DisplayMember = value; }
    }

    public string ValueMember
    {
        get { return fooListBox.ValueMember; }
        set
        {
            if ((value != null) && (value != ""))
                fooListBox.ValueMember = value;
        }
    }

    public string LookupMember
    {
        get
        {
            if (fooListBox.SelectedValue != null)
                return fooListBox.SelectedValue.ToString();
            else
                return "";
        }
        set
        {
            if ((value != null) && (value != ""))
                fooListBox.SelectedValue = value;
        }
    }

Изатем, как и в моем исходном примере, вы связываете так же, как если бы вы связывались с обычным списком:

// fooSelector1 is your FooSelector user control
fooSelector1.DisplayMember = "Name";
fooSelector1.DataSource = bindingSourceFoos;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...