2009-02-08 3 views
2

Привет, я сейчас пишу свой первый .net gui. Мне интересно, есть ли какой-то конкретный способ, который я должен применить к моим объектам poco, чтобы они были привязаны к usercontrol. У меня есть несколько объектов, но я, похоже, не могу связать их с моим usercontrol.Bind POCO to UserControl

Я где-то читал, что им нужно реализовать IBindable, но я не могу поколебать ощущение, что кто-то уже устранил весь этот дублирующий код, который мне нужно будет вводить во все мои классы. Есть ли способ легко связать их или мне придется использовать наборы данных или тому подобное, чтобы легко получить эту привязку. У меня есть крайнее отвращение к наборам данных, чтобы представить другие подходящие варианты ;-)

Я пытаюсь связать с usercontrols из инструментария devexpress.

+0

Какой инструмент вы используете? WinForms, WPF, GTK, ...? –

+0

Я использую winforms и devexpress. – 2009-02-08 15:30:12

ответ

0

BindingList может использоваться для привязки к спискам общих объектов.

1

Какая архитектура?

Для 1-полосной привязки, вы ничего, кроме общедоступных свойств не нужны - и, возможно, некоторые TypeConverter реализации для любых типов данных, сделанных на заказ (struct s и т.д.)

Для полной привязки 2-полосной, вы будете нужна реализация ТРОЕБОРЬЕ - любой из:

  • "общественное событие EventHandler FooChanged" для каждого свойства "Foo"
  • `INotifyPropertyChanged реализация
  • на заказ COMPON лор-модель (не ходите туда - избыточна)

Для примера INotifyPropertyChanged реализации (обратите внимание, вы можете переместить часть кода для повторного использования):

public class Foo : INotifyPropertyChanged 
{ 
    private string bar; 
    public string Bar 
    { 
     get { return bar; } 
     set { UpdateField(ref bar, value, "Bar"); } 
    } 
    // other properties... 

    public event PropertyChangedEventHandler PropertyChanged; 

    protected virtual void OnPropertyChanged(string propertyName) 
    { 
     if (PropertyChanged != null) PropertyChanged(this, 
      new PropertyChangedEventArgs(propertyName)); 
    } 
    protected bool UpdateField<T>(ref T field, T value, 
     string propertyName) 
    { 
     if (!EqualityComparer<T>.Default.Equals(field, value)) 
     { 
      field = value; 
      OnPropertyChanged(propertyName); 
      return true; 
     } 
     return false; 
    } 
} 

Для bind устанавливает данных (сетки и т. д.), проще всего использовать дженерики; в основном, minumum - IList - но вы получаете дополнительные метаданные от индексатора public T this[int index] - который List<T>, Collection<T> и т.п. все есть. Подробнее - BindingList<T> реализует IBindingList, разрешая события уведомления на основе коллекции (но только до INotifyPropertyChanged - не для шаблона FooChanged).

+0

У меня есть свойства, которые также имеют мои пользовательские объекты, которые не отображаются. У человека есть свойство Address, которые являются и моими объектами poco. Как связать адрес? – 2009-02-08 15:51:37

+0

На простейших? Переопределяя ToString() - но как вы это показываете? Какой контроль (ы)? –

+0

Текстовое поле, GridView и т. Д. – 2009-02-08 22:33:47