Связывание данных с объектом в C #

Objective-c / cocoa предлагает форму привязки, где свойства элемента управления (то есть текст в текстовом поле) могут быть привязаны к свойству объекта. Я пытаюсь дублировать эту функцию в C # w / .Net 3.5.

Я создал следующий очень простой class в файле MyClass.cs:

class MyClass { private string myName; public string MyName { get { return myName; } set { myName = value; } } public MyClass() { myName = "Allen"; } } 

Я также создал простую форму с 1 текстовым полем и 1 кнопкой. Я инициализировал один экземпляр Myclass внутри кода формы и построил проект. Используя мастер DataSource в Vs2008, я выбрал для создания источника данных на основе объекта и выбрал сборку MyClass. Это создало объект источника данных. Я изменил привязку привязки текстового поля к этому источнику данных; однако ожидаемый результат (то, что содержимое текстового поля будет «allen») не было достигнуто. Кроме того, размещение текста в текстовое поле не обновляет свойство имени объекта.

Я знаю, что у меня нет чего-то фундаментального. В какой-то момент мне нужно привязать мой экземпляр classа MyClass, который я инициализировал внутри кода формы, в текстовое поле, но этого не произошло. Все, что я просматривал в Интернете, похоже, замалчивается с использованием DataBinding с объектом (или я просто не знаком), поэтому любая помощь очень ценится.

Редактировать:

Используя то, что я узнал по ответам, я просмотрел код, созданный Visual Studio, и он имел следующее:

 this.myClassBindingSource.DataSource = typeof(BindingTest.MyClass); 

если я прокомментирую это и заменим:

 this.myClassBindingSource.DataSource = new MyClass(); 

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

Вы должны назначить источник данных текстового поля как ваш новый источник данных. Но кроме того, вы должны назначить источник данных источника данных как экземпляр вашего classа.

 MyDataSource.DataSource = new MyClass(); TextBox1.DataSource = MyDataSource; 

Это должно сработать для вашего первого прохода. Как уже упоминалось, вам может потребоваться реализовать дополнительные интерфейсы для вашего classа (INotifyPropertyChanged и т. Д.), Если вы собираетесь модифицировать свойства classа с помощью любых фоновых процессов.

Если вы только обновляете свойства через форму, вам не нужен этот шаг.

Вы должны реализовать интерфейс INotifyPropertyChanged для вашего типа MyClass:

 public class MyClass : INotifyPropertyChanged { private string _myName; public string MyName { get { return _myName; } set { if( _myName != value ) { _myName = value; OnPropertyChanged("MyName"); } } } public event PropertyChangedEventHandler PropertyChanged; private void OnPropertyChanged(string propertyName) { if( PropertyChanged != null ) PropertyChanged( this , new PropertyChangedEventArgs(propertyName) ); } } 

Этот интерфейс необходим для инфраструктуры DataBinding, если вы хотите поддерживать простое привязку данных. Интерфейс INotifyPropertyChanged используется для уведомления «привязки», что свойство изменилось, поэтому инфраструктура DataBinding может действовать соответствующим образом.

Затем вы можете привязать свойство MyName к текстовому свойству текстового поля.

Я получаю сообщение об ошибке в методе DataBinding.Add("TEXT", myObject, myObjectProperty)

Вероятно, это связано с тем, что вы не указали явный {get; set;} в объявлении свойства!

ПЛОХОЙ:

 public string FirstName; //<-- you will not be able to bind to this property! 

ХОРОШО:

 public string FirstName { get; set; } 

Похоже, вам, вероятно, нужен атрибут Bindable в свойстве MyName (и следуйте за предложением Фредерика):

  [System.ComponentModel.Bindable(true)] public string MyName { get { return _myName; } set { if( _myName != value ) { _myName = value; OnPropertyChanged("MyName"); } } } 

Через: http://support.microsoft.com/kb/327413

У меня нет кодов передо мной, но я думаю, что источник данных похож на коллекцию. Вы должны добавить экземпляр MyClass в источник данных, и это то, к чему будут привязаны поля формы. Существуют также способы навигации по источнику данных в несколько экземпляров MyClass, но это не похоже на то, что вам нужно. Проверьте документы для DataSource.

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

 using System.Collections.Generic; public class SiteDataItem { private string _text; private string _url; private int _id; private int _parentId; public string Text { get { return _text; } set { _text = value; } } public string Url { get { return _url; } set { _url = value; } } public int ID { get { return _id; } set { _id = value; } } public int ParentID { get { return _parentId; } set { _parentId = value; } } public SiteDataItem(int id, int parentId, string text, string url) { _id = id; _parentId = parentId; _text = text; _url = url; } public static List GetSiteData() { List siteData = new List(); siteData.Add(new SiteDataItem(1, 0, "All Sites", "")); siteData.Add(new SiteDataItem(2, 1, "Search Engines", "")); siteData.Add(new SiteDataItem(3, 1, "News Sites", "")); siteData.Add(new SiteDataItem(4, 2, "Yahoo", "http://www.yahoo.com")); siteData.Add(new SiteDataItem(5, 2, "MSN", "http://www.msn.com")); siteData.Add(new SiteDataItem(6, 2, "Google", "http://www.google.com")); siteData.Add(new SiteDataItem(7, 3, "CNN", "http://www.cnn.com")); siteData.Add(new SiteDataItem(8, 3, "BBC", "http://www.bbc.co.uk")); siteData.Add(new SiteDataItem(9, 3, "FOX", "http://www.foxnews.com")); return siteData; } } 

Более подробно вы можете прочитать учебник dapfor. ком