Привязка выпадающего в WinForms - PullRequest
5 голосов
/ 30 марта 2009

Представьте себе эти два класса:

class Part
{
 public string Name { get; set;}
 public int Id { get; set; }
}

class MainClass
{
 public Part APart { get; set;}
}

Как связать MainClass с полем со списком в WinForm, чтобы он отображал Part.Name (DisplayMember = "Name";), а выбранный элемент со списком устанавливает свойство APart MainClass без необходимости обрабатывать какие-либо события Выпадающие.

Насколько я знаю, установка ValueMember ComboBox на "Id" означает, что он попытается установить APart на номер (Id), который не является правильным.

Надеюсь, это достаточно ясно!

Ответы [ 4 ]

1 голос
/ 30 марта 2009

Вам нужно, чтобы ValueMember (= ComboBox.SelectedItem) был ссылкой на сам объект, в то время как DisplayMember - это единственное свойство элемента, верно? Насколько я знаю, нет хорошего способа сделать это без создания собственного ComboBox и выполнения связывания самостоятельно из-за способа работы ValueMember и DisplayMember.

Но вот пара вещей, которые вы можете попробовать (при условии, что у вас где-то есть коллекция Part с):

  1. Переопределите метод `ToString ()` `Part`, чтобы вернуть свойство` Name`. Затем установите для вашего `ComboBox` ValueMember` значение" APart "` и оставьте `DisplayMember` пустым. (Не проверено, поэтому никаких гарантий)
  2. Вы можете создать новое свойство в Part для возврата ссылки на себя. Установите ValueMember для нового свойства, а DisplayMember для «Name». Это может выглядеть как взлом, но это должно сработать.
  3. Делайте забавные вещи с помощью своего «APart» геттера и сеттера. Вы потеряете некоторую строгую типизацию, но если вы сделаете `APart` объектом, а` MainClass` содержит коллекцию `Part`s, вы можете установить его с помощью` Id` (`int`) или` Part`. (Очевидно, вы захотите установить его по Id при привязке к нему ComboBox.)
Part _APart;
object APart 
{ 
    get {return _APart;}
    set {
        if(value is int)
            _APart = MyPartCollection.Where(p=>p.Id==value).Single();
        else if(value is Part)
            _APart = value;
        else
            throw new ArgumentException("Invalid type for APart");
    }
}
0 голосов
/ 31 марта 2009

создайте класс поддержки для хранения «информации» и создайте свойства для всех данных. Затем реализуйте System.ComponentModel.INotifyPropertyChanged для этого класса, что-то вроде:

private String _SelectedPart = String.Empty; 

public String SelectedPart 
{
   get  
   {   
      return _SelectedPart;   
   }  
   set   
   {            
      if (_SelectedPart != value)  
      {
         _SelectedPart  = value;   

         // helper method for handing the INotifyPropertyChanged event
         PropertyHasChanged(); 
      }
   }
}

Затем создайте «ObjectDataSource» для этого класса (Shift-Alt-D в VS2008 поднимет это при просмотре формы), затем щелкните ComboBox и установите следующие свойства:

DataSource, установите для ObjectDataSource "BindingSource", который вы только что создали. DisplayMember, установите для свойства Name списка деталей ValueMember, установить идентификатор члена списка деталей DataBindings.SelectedValue, установите значение SelectedPart для «BindingSource», который вы только что создали.

Я знаю, что вышеупомянутое звучит сложно, и может потребоваться некоторое время, чтобы найти все части, которые я только что описал (если бы я мог дать учебник или скриншот), но на самом деле это ОЧЕНЬ быстро, когда вы привыкнете к нему.

Кстати, это считается «привязкой данных» в .NET, и есть несколько хороших учебников, которые могут дать вам больше информации.

0 голосов
/ 30 марта 2009

Если вы установите значение ValueMember поля со списком в null, привязка данных вернет выбранный элемент (т.е. экземпляр Part) вместо указанного элемента. Установите для DisplayMember значение «Имя».

0 голосов
/ 30 марта 2009

Я провел небольшое исследование и обнаружил эту статью , где автору удалось связать вложенные свойства, расширив стандартный исходный компонент привязки. Я пробовал, и, кажется, работает нормально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...