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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Binding, Каковы правила построения? 
:(
    Опции темы
albert21
Дата 13.12.2008, 19:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Всем привет.

Недавно начал изучать WPF. Разбираю вопрос привязки данных к элементам управления.
Задача типовая: Есть список с объектами пользовательского класса (у меня класс содержит две строки - имя, фамилию). Необходимо подвязать этот список к элементу управления ListBox. 

Вот примеры реализации http://msdn.microsoft.com/ru-ru/library/aa970558.aspxhttp://msdn.microsoft.com/ru-ru/magazine/cc163299.aspx

В них приведены различные варианты решения. В одном используется <ObjectDataProvider/> и класс который возвращает список элементов, в другом создаётся класс-наследник от ObservableCollection<класс элемента списка>. Рассмотрев их я так и не пришёл к чёткому пониманию того как подвязывать данные smile

Ключевая строчка: <ListBox ItemsSource="{Binding Source={???} Path={???}}"/> 
1) Что можно и нужно указывать для свойств Source и Path?

2) Каким условиям должны удовлетворять значения этих свойств?

Например:
Код

    public partial class Window1 : Window
    {
            ObservableCollection<класс элемента списка> list = new ObservableCollection<класс элемента списка>();
            
            ......
            public Window1()
            {
                 InitializeComponent();
            }
    }

Можно ли подвязаться к list?
--------------------
http://www.certifications.ru/publicresults.php?tu_id=45939
PM MAIL   Вверх
Partizan
Дата 13.12.2008, 20:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: 9
Всего: 67



albert21, list лучше превратить в DependencyProperty.

Source="имя_объекта_класса_window1"
Path="имя_свойства_представляющего =_list"


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
rooks
Дата 13.12.2008, 21:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

Репутация: 5
Всего: 9



Привязку данных можно делать и в code behind.
Код

<ListBox x:Name="listbox"/> 

Код

    public partial class Window1 : Window
    {
            ObservableCollection<класс элемента списка> list = new ObservableCollection<класс элемента списка>();
            
            ......
            public Window1()
            {
                 InitializeComponent();
                 listbox.ItemsSource = listbox;
            }
    }

PM MAIL ICQ   Вверх
Partizan
Дата 14.12.2008, 00:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: 9
Всего: 67



rooks, это не дело...


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
albert21
Дата 14.12.2008, 17:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Ок.
1) в Source записывается имя public класса-владельца объекта-источника данных
2) в Path записывается имя public свойства представляющего объекта-источника данных

Могу ли я получить значение индекса текущего элемента в источнике данных (в примере источником служит список list)?
Что -то вроде "{Binding Source={StaticResource MyFriends}, Path=LIST[current_item].SURNAME}"
--------------------
http://www.certifications.ru/publicresults.php?tu_id=45939
PM MAIL   Вверх
rooks
Дата 14.12.2008, 17:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

Репутация: 5
Всего: 9



2Partizan просто я не знаю как сделать по-другому, было бы не плохо посмотреть на пример...

2albert21 если нужно, чтобы в списке отображались фамилии можно:
1. Переопределить в "класс элемента списка" метод ToString(), но это не очень красиво.
2. Написать DataTemplate для элементов листбокса, например так:
Код
        <ListBox x:Name="listbox">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Vertical">
                        <TextBlock Text="{Binding Path=SURNAME}"/>
                    </StackPanel> 
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>

PM MAIL ICQ   Вверх
Partizan
Дата 14.12.2008, 18:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: 9
Всего: 67



rooks, я ж говорю - превратить его в DependencyProperty smile


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
albert21
Дата 14.12.2008, 19:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



С DataTemplate я тоже видел пример, там ещё в разметке XAML для ListBox указывается свойство IsSynchronizedWithCurrentItem="True".
А механизма прямого обращения к текущему элементу нет?

Напиши пожалуйста подробнее о DependencyProperty применительно к теме?
--------------------
http://www.certifications.ru/publicresults.php?tu_id=45939
PM MAIL   Вверх
Partizan
Дата 14.12.2008, 20:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: 9
Всего: 67



albert21

в данном случае вполне можно обойтись public свойством в приватным setter-ом.



Что касается DependencyProperty, то вот например так:

Код

  public ObservableCollection<класс элемента списка> List
  {
    get { return (ObservableCollection<класс элемента списка>)this.GetValue(ListProperty); }
    set { this.SetValue(ListProperty, value); } 
  }
  public static readonly DependencyProperty ListProperty = DependencyProperty.Register(
    "List", typeof(ObservableCollection<класс элемента списка>), typeof(Window1), new PropertyMetadata(null));




--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | WPF и Silverlight | Следующая тема »


 




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


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

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