Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> DataBindings, Постигаем суть привязки данных 
V
    Опции темы
Freak_FB
Дата 22.4.2010, 18:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ктулхувед
**


Профиль
Группа: Участник
Сообщений: 296
Регистрация: 13.10.2006

Репутация: 1
Всего: 4



Пытаюсь освоить Data Binding в .NET. Написал код по статье с RSDN, где попытался привязать свойства объекта к визуальным элементам отображения (в частности, к TextBox).

Вот мой код формы (C# 2.0):
Код

using System;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        BookInfo bi;

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            bi = CreateBookInfo();

            txtAuthor.DataBindings.Add("Text", bi, "Author");
            txtTitle.DataBindings.Add("Text", bi, "Title");
            txtISBN.DataBindings.Add("Text", bi, "ISBN");
            txtPageCount.DataBindings.Add("Text", bi, "PageCount");
            txtPublisher.DataBindings.Add("Text", bi, "Publisher");
        }

        private BookInfo CreateBookInfo()
        {
            BookInfo bookInfo = new BookInfo();
            bookInfo.Author = "Том Клэнси";
            bookInfo.Title = "Игры патриотов";
            bookInfo.ISBN = "5-699-18175-Х";
            bookInfo.PageCount = 706;
            bookInfo.Publisher = "ЭКСМО";
            return bookInfo;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            MessageBox.Show(bi.ISBN);
        }

        private void button2_Click(object sender, EventArgs e)
        {
            bi.ISBN = "123";
            //txtISBN.DataBindings[0].ReadValue();
        }
    }

    class BookInfo
    {
        private string author;

        public string Author
        {
            get { return author; }
            set { author = value; }
        }

        private string title;

        public string Title
        {
            get { return title; }
            set { title = value; }
        }

        private string isbn;

        public string ISBN
        {
            get { return isbn; }
            set { isbn = value; }
        }

        private int pageCount;

        public int PageCount
        {
            get { return pageCount; }
            set { pageCount = value; }
        }

        private string publisher;

        public string Publisher
        {
            get { return publisher; }
            set { publisher = value; }
        }
    }
}


Хочу при нажатии на первую кнопку показать ISBN, на вторую кнопку - изменить его на произвольное значение.
Хочется, чтобы при изменении поля объекта сразу же обновлялся элемент отображения (как и подразумевается в статье, и как, думается мне, работает Data Binding). Но он, почему-то, не меняется.
То есть, при изменении TextBox, при событии OnValidate, соответствующее поле объекта изменяется, а вот наоборот - нет.

Подскажите, что я не так делаю.


--------------------
user posted image
user posted image
Тонет Ктулху, все медведы горят в огне.
Я Креведко, очень страшно сегодня мне.

PM MAIL ICQ Skype GTalk Jabber   Вверх
jonie
Дата 22.4.2010, 20:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 22
Всего: 118



У вас работает так называемая односторонняя привязка (OneWay Binding) (это когда элемент может воздействовать на переданную в биндинге ссылку на объект).
Подумайте сами: как текстовое поле узнает что кто-то что-то поменял в объекте? Ответ - никак (если не брать в учет всякие там AOP (аспектно-ориентированное программирование) -- пока не думайте об этом).
Так вот, чтобы сделать это самое уведомление, ваш объект и текст бокс должны реализовать паттерн Observer (слушатель) [подробнее]
В рамках .NET это делается через имплементацию слушаемым объектом INotifyPropertyChanged интерфейса, который содержит только один event - public PropertyChanged.

Как его реализовать можено посмотреть тут: http://msdn.microsoft.com/en-us/library/ms229614.aspx
Самый главный смысл - вызывать событие, на которое кстати подпишется текстбокс, при set поля в обекте:
Код

        set 
        {
            if (value != this.phoneNumberValue)
            {
                this.phoneNumberValue = value;
                NotifyPropertyChanged("PhoneNumber");  //уведомляем слушателя (текстбокс) о том что поле поменялось
            }
        }



Замечу, что данный подход действует и для коллекций объектов, с той лишь разницей, что там надо реализовать INotifyCollectionChanged...


фуф... многа букаф в общем 8)


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Freak_FB
  Дата 23.4.2010, 10:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ктулхувед
**


Профиль
Группа: Участник
Сообщений: 296
Регистрация: 13.10.2006

Репутация: 1
Всего: 4



Спасибо, новые материалы помогли делу.
Про INotifyPropertyChanged я читал, но не понял сразу, куда его прикручивать. Сейчас всё стало понятно.


--------------------
user posted image
user posted image
Тонет Ктулху, все медведы горят в огне.
Я Креведко, очень страшно сегодня мне.

PM MAIL ICQ Skype GTalk Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0770 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.