Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.81/120: Рейтинг темы: голосов - 120, средняя оценка - 4.81
Эксперт Java
 Аватар для KEKCoGEN
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672

Создание простого Binding'a (привязка класса к ListBox)

06.04.2012, 00:34. Показов 24934. Ответов 23
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
При освоении технологии binding столкнулся с проблемой. Есть ListBox и есть, скажем класс Person. Определяем ObservableCollection<Person> ppl и хотим привязать его содержимое в ListBox. Для этого делаю следующее:

XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<Grid>
        <ListBox ItemsSource="{Binding Path=ppl}" Height="194" HorizontalAlignment="Left" Margin="12,12,0,0" Name="listBox1" VerticalAlignment="Top" Width="151">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <Grid ShowGridLines="True">
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="20" />
                            <ColumnDefinition Width="20" />
                        </Grid.ColumnDefinitions>
 
                        <TextBlock Text="{Binding Name}"
                                           Grid.Column="0" />
                        <TextBlock Text="{Binding Age}"
                                           Grid.Column="1" />
                    </Grid>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
        <Button Content="Add" Height="23" HorizontalAlignment="Left" Margin="182,12,0,0" Name="button1" VerticalAlignment="Top" Width="75" Click="button1_Click" />
    </Grid>
В Code Behind:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
namespace WpfApplication1
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public ObservableCollection<Person> ppl;
        public MainWindow()
        {
            InitializeComponent();
            ppl = new ObservableCollection<Person>();
      //     listBox1.ItemsSource = ppl;
            ppl.Add(new Person { Name = "One", Age = 15 });
        }
 
        private void button1_Click(object sender, RoutedEventArgs e)
        {
            ppl.Add(new Person { Name = "Two", Age = 25 });
   
        }
    }
}
Окно ListBox остается пустым. В интернете нашел инфу что надо реализовывать некий интерфейс, но если раскомментировать строку // listBox1.ItemsSource = ppl; то все работает....да и где то видел приимер привязки без этого самого интерфейса.
Спасибо

Добавлено через 17 часов 6 минут
Неужели нет ответа на вроде бы простой вопрос?
2
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
06.04.2012, 00:34
Ответы с готовыми решениями:

Создание простого класса
Приветствую Вас, программисты! Решите мне, пожалуйста, одну задачку на простые классы. Сейчас работаю на Visual Studio 2012 с линейными...

Создание простого класса Rectangle
задание Реализовать класс Rectangle. Полями являются его стророны — положительные числа с плавающей точкой. Требуется реализовать...

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

23
 Аватар для skilllab
296 / 236 / 58
Регистрация: 03.02.2011
Сообщений: 2,051
Записей в блоге: 1
23.08.2018, 13:21
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Эта ссылка на null и была присвоена как источник
Всё верно.

Добавлено через 1 минуту
Цитата Сообщение от SatanaXIII Посмотреть сообщение
уже подсказал
Не увидел. Невнимательный я))

Добавлено через 3 минуты
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Но он не даёт уведомления об изменении значения элементов, и о переинициализации списка
Для этой штуки можно сделать вот так
1
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
24.08.2018, 10:07
Так, ладно, а самый интересный то вопрос:
Цитата Сообщение от SatanaXIII Посмотреть сообщение
А в чем же разница?
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16150 / 11271 / 2890
Регистрация: 21.04.2018
Сообщений: 33,144
Записей в блоге: 2
24.08.2018, 13:48
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Так, ладно, а самый интересный то вопрос:
Цитата Сообщение от SatanaXIII Посмотреть сообщение
А в чем же разница?
По моему предположению из такой цитаты
RelativeSource
Указывает на исходный объект, использующий объект RelativeSource, который позволяет базировать ссылку на текущем элементе. Это специализированный инструмент, который удобен при написании шаблонов элементов управления и шаблонов данных.
я предполагаю, что в таком случае связывание создаётся не в момент инициализации элемента, а в момент его визуализации. И, соответственно, если к этому моменту объект для связывания уже создан, то он "подхватывается" связкой.

Добавлено через 7 минут
Пытался понять https://docs.microsoft.com/ru-... pextension
Но моего английского не хватает, а русский перевод - кривой.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16150 / 11271 / 2890
Регистрация: 21.04.2018
Сообщений: 33,144
Записей в блоге: 2
26.08.2018, 11:23
Для проверки предположения проделал эксперемент
XAML
Кликните здесь для просмотра всего текста
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
    <Grid Margin="10">
        <Grid.RowDefinitions>
            <RowDefinition/>
            <RowDefinition Height="Auto"/>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition  />
            <ColumnDefinition />
        </Grid.ColumnDefinitions>
 
        <DataGrid AutoGenerateColumns="True" 
                  Name="DG1" Margin="10"
                  ItemsSource="{Binding DGItems, ElementName=DGForm}"
            />
 
        <DataGrid Grid.Column="1"
                  AutoGenerateColumns="True" 
                  Name="DG2" Margin="10"
                  ItemsSource="{Binding Path=DGItems, 
                                        RelativeSource={RelativeSource FindAncestor, AncestorType=Window}}"
                />
        <Button x:Name="Button_ChangeLink" Content="Изменить ссылку" VerticalAlignment="Center" HorizontalAlignment="Center" Click="Button_ChangeLink_Click"  Grid.Row="1"/>
        <Button x:Name="Button_Notify" Content="Уведомить об изменении" VerticalAlignment="Center" HorizontalAlignment="Center" Click="Button_Notify_Click"  Grid.Row="1" Grid.Column="1"/>
    </Grid>

Код
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
    public partial class MainWindow : Window, INotifyPropertyChanged
    {
        public ObservableCollection<DGItem> DGItems { get; set; }
 
        #region PropertyChanged
        public event PropertyChangedEventHandler PropertyChanged;
        private void NotifyPropertyChanged(string propertyName)
            => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        #endregion
 
        private ObservableCollection<DGItem> DGItems_Link1
            = new ObservableCollection<DGItem>
            {
                new DGItem("S", 1),
                new DGItem("Q", 2),
                new DGItem("R", 3)
            };
        private ObservableCollection<DGItem> DGItems_Link2
            = new ObservableCollection<DGItem>
            {
                new DGItem("Ы", 45),
                new DGItem("Й", 67),
                new DGItem("Ц", 89)
            };
 
        public MainWindow()
        {
            InitializeComponent();
 
            DGItems = DGItems_Link1;
 
        }
 
 
        private void Button_ChangeLink_Click(object sender, RoutedEventArgs e)
        {
            if (DGItems == DGItems_Link1) DGItems = DGItems_Link2;
            else DGItems = DGItems_Link1;
        }
 
        private void Button_Notify_Click(object sender, RoutedEventArgs e)
        {
            NotifyPropertyChanged("DGItems");
        }
    }

Предположение подтвердилось!
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
26.08.2018, 11:23
Помогаю со студенческими работами здесь

Привязка Listbox не срабатывает
Привет всем! Не могу понять почему ListBox не срабатывает при привязке одним способом а другим способом всё хорошо работает, в чём таится...

ListBox, ComboBox и привязка
Здравствуйте. Покажите, пожалуйста, как реализовать следующее: Ситуация первая. Есть ListBox с тремя строками содержимого. Как при...

Привязка данных ListBox
Вообщем такая проблема....как связать ListBox со списком фотографий....на msdn есть пример &lt;ListBox ItemsSource=&quot;{Binding...

Привязка данных ListBox
Как привязать картинку и текст к листбоксу (xaml &amp; C#)??? Тоесть должна картинка и текст подгружатся с БД в колекцию, и потом с колекции в...

Привязка к ListBox SelectedItems
Есть простой ListBox с мультиселектом: ListBox SelectionMode=&quot;Multiple&quot; HorizontalAlignment=&quot;Left&quot; Height=&quot;100&quot;...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
24
Ответ Создать тему
Новые блоги и статьи
Асинхронный приём данных из COM-порта
Argus19 01.05.2026
Асинхронный приём данных из COM-порта Купил на aliexpress термопринтер QR701. Он оказался странным. Поключил к Arduino Nano. Был очень удивлён. Наотрез отказывается печатать русские буквы. Чтобы. . .
попытка написать игровой сервер на C++
pyirrlicht 29.04.2026
попытка написать игровой сервер на плюсах с открытым бесконечным миром. возможно получится прикрутить интерпретатор питон для кастомизации игровой логики. что есть на текущий момент:. . .
Контроль уникальности выбранного документа-основания при изменении реквизита
Maks 28.04.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРемонтСпецтехники", разработанного в КА2. Задача: уведомлять пользователя, если указанная заявка (документ-основание). . .
Благородство как наказание
Maks 24.04.2026
У хорошего человека отношения с женщинами всегда складываются трудно. А я человек хороший. Заявляю без тени смущения, потому что гордиться тут нечем. От хорошего человека ждут соответствующего. . .
Валидация и контроль данных табличной части документа перед записью
Maks 22.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в КА2. Задача: контроль и валидация данных табличной части документа перед записью с учетом регламента компании. . .
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru