Подтвердить что ты не робот

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

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

Я создал следующий очень простой класс в файле 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" ) не был достигнут. Кроме того, размещение текста в текстовое поле не обновляет свойство имени объекта.

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

Edit:

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

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

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

this.myClassBindingSource.DataSource = new MyClass();

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

Вы должны реализовать интерфейс 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 к текстовому свойству текстового поля.

Ответ 3

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

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

BAD:

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

ХОРОШО:

public string FirstName { get; set; }

Ответ 4

Похоже, вам, вероятно, нужен атрибут 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

Ответ 5

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

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

Ответ 6

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<SiteDataItem> GetSiteData() 
{  
    List<SiteDataItem> siteData = new List<SiteDataItem>();
    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. ком