Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > WPF и Silverlight > Binding


Автор: albert21 13.12.2008, 19:43
Всем привет.

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

Вот примеры реализации http://msdn.microsoft.com/ru-ru/library/aa970558.aspx, http://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?

Автор: Partizan 13.12.2008, 20:52
albert21, list лучше превратить в DependencyProperty.

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

Автор: rooks 13.12.2008, 21:56
Привязку данных можно делать и в code behind.
Код

<ListBox x:Name="listbox"/> 

Код

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

Автор: Partizan 14.12.2008, 00:55
rooks, это не дело...

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

Могу ли я получить значение индекса текущего элемента в источнике данных (в примере источником служит список list)?
Что -то вроде "{Binding Source={StaticResource MyFriends}, Path=LIST[current_item].SURNAME}"

Автор: rooks 14.12.2008, 17:54
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>

Автор: Partizan 14.12.2008, 18:47
rooks, я ж говорю - превратить его в DependencyProperty smile

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

Напиши пожалуйста подробнее о DependencyProperty применительно к теме?

Автор: Partizan 14.12.2008, 20:00
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));


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)