Простая привязка данных - PullRequest
       1

Простая привязка данных

6 голосов
/ 11 августа 2010

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

// this class represents some kind of data producer
public class DataSourceClass
    {
        public string Data { get; set; }

        public DataSourceClass()
        { }
    }


//this form holds the TextBox control as the Data consumer
public partial class DatabindingTestForm : Form
    {
        public DataSourceClass ds { get; set; }
        public DatabindingTestForm()
        {
            InitializeComponent();
            ds = new DataSourceClass();
            textBox.DataBindings.Add("Text", ds, "Data");
        }

        private void checkBox_CheckedChanged(object sender, EventArgs e)
        {
            if (checkBox.Checked)
                ds.Data = "CHECKED";
            else
                ds.Data = "NOT CHECKED";
        }
    }

Я не добавилкод конструктора, но он есть, и форма содержит объект TextBox и объект CheckBox.Как вы понимаете, я пытаюсь изменить свойство Textbox Text, когда пользователь проверяет \ снимает флажок CheckBox.Но этот код не обновляет свойство TextBox Text.Может кто-нибудь объяснить, что мне не хватает?

Ответы [ 2 ]

7 голосов
/ 11 августа 2010

Вам нужно каким-то образом уведомлять WinForms, когда значение свойства Data изменяется.Наиболее простой способ - это:

  • Добавить событие в DataSourceClass: public event EventHandler DataChanged;
  • Сделать DataSourceClass орудие INotifyPropertyChanged.Это дает вам PropertyChanged событие.

В любом случае у вас будет новое событие, которое вам нужно поднять.Вам необходимо преобразовать ваше свойство Data из автоматического свойства в свойство с закрытым полем, методом get и методом set.Если у вас есть явный метод получения и установки для свойства Data, вы сможете поднять событие изнутри в установщике.

4 голосов
/ 11 августа 2010

Вы можете использовать интерфейс INotifyPropertyChanged. Я не запускал это через IDE / компилятор, поэтому могла возникнуть ошибка синтаксиса.

public class DataSourceClass : INotifyPropertyChanged
{ 
    private string _data;

    public string Data
    {
        get
        {
            return _data;
        }  
        set
        {
            if( _data != value )
            {
                _data = value;
                OnPropertyChanged( "data" );
            }
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    private void OnPropertyChanged( string propertyName )
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if( handler != null )
        {
            handler( new PropertyChangedEventArgs( propertyName ) );
        }
    }
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...