powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / ListBox: Элемент и его ID.
11 сообщений из 11, страница 1 из 1
ListBox: Элемент и его ID.
    #37076515
RegisteredUser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Задача проста как валенки, но шось не могу найти как это реализуется в WPF.

Я хочу загружать в ListBox данные из таблицы-словаря, т.е. соответствие "ИмяЭлемента - IDЭлемента"
Например такое:
авторГород = 11
Поселок = 21
...
Хутор = 130
С загрузкой "ИмениЭлемента" проблем нет - ListBox1.Items.Add("ИмяЭлемента");
А как поставить в ListBox1 в соответсвие каждому"ИмениЭлемента" еще и IDЭлемента.
Т.е. при клике на каждом элементе ListBox1 я хочу помимо Названия Элемента еще получать его ID.
Как это делается в WPF?
...
Рейтинг: 0 / 0
ListBox: Элемент и его ID.
    #37077219
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
загружать в список (подсовывать источник элементов itemscontrol-у) лучше имеющийся словарь а не его "производную", это и эффективней(не плодить лишних сущностей) и в результате получим выбранный элемент словаря - со всеми его свойствами

ну а отображать, так это либо так
Код: plaintext
1.
2.
3.
4.
5.
        <ListBox...>
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel...>
                        <TextBlock Text="{Binding ...
либо (если лень прописывать Template ради одного поля) в элементе словаря оверрайдить метод ToString(), у меня для таких словарей:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
    public class IdNamePair
    {
        public int ID { get; set; }
        public string Name { get; set; }

        public override bool Equals(object obj)
        {
            if (null == obj) {
                return false;
            }
            return this.ID == ((IdNamePair)obj).ID;
        }
        public override int GetHashCode()
        {
            return Name.GetHashCode();
        }
        public override string ToString()
        {
            return Name;
        }
    }
...
Рейтинг: 0 / 0
ListBox: Элемент и его ID.
    #37077894
Руки-крюки
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На таком простом примере есть отличная возможность освоить Data Binding + MVVM.
Заводим класс ListItemViewModel.
Код: plaintext
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.
public class ListItemViewModel : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    int id;
    string name;

    public int Id
    {
        get { return id; }
        set
        {
            id = value;
            OnPropertyChanged("Id");
        }
    }

    public string Name
    {
        get { return name; }
        set
        {
            name = value;
            OnPropertyChanged("Name");
        }
    }

    public ListItemViewModel()
    {
    }

    private void OnPropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = this.PropertyChanged;
        if (handler != null)
        {
            var e = new PropertyChangedEventArgs(propertyName);
            handler(this, e);
        }
    }
}

На главной форме (или в другой ViewModel, например в MainWindowViewModel) держим ObservableCollection<ListItemViewModel> ItemsList. Там же делаем загрузку списка из источника.

Для отображения делаем так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
        <ListBox ItemsSource="{Binding Path=ItemsList}">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal">
                        <TextBlock Text="{Binding Path=Name}" />
                        <TextBlock Text=" = " />
                        <TextBlock Text="{Binding Path=Id}" />
                    </StackPanel>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>

Вот вам небольшой пример. Для удобства некоторый код из ListItemViewModel можно перенести в BaseViewModel. И все ViewModel наследовать от BaseViewModel.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
public abstract class BaseViewModel : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    protected BaseViewModel()
    {
    }

    public void OnPropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = this.PropertyChanged;
        if (handler != null)
        {
            var e = new PropertyChangedEventArgs(propertyName);
            handler(this, e);
        }
    }
}

Тогда ListItemViewModel будет выглядеть так:
Код: plaintext
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.
public class ListItemViewModel : BaseViewModel 
{
    int id;
    string name;

    public int Id
    {
        get { return id; }
        set
        {
            id = value;
            OnPropertyChanged("Id");
        }
    }

    public string Name
    {
        get { return name; }
        set
        {
            name = value;
            OnPropertyChanged("Name");
        }
    }

    public ListItemViewModel()
    {
    }
}

Если для главной формы завести ViewModel, то нужно эту вью модель пихнуть в DataContext формы.
Код: plaintext
1.
2.
3.
4.
<Window xmlns:main="clr-namespace:myNameSpace">
    <Window.DataContext>
        <main:MainWindowViewModel />
    </Window.DataContext>
</Window>
...
Рейтинг: 0 / 0
ListBox: Элемент и его ID.
    #37078047
RegisteredUser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Крррасотыщщща!
Хера се что навыдумывали.
Помнится в ASP.Net был простой ListItem для таких целей, а тут така гора букоф.

Ладно! Пасибо на добром слове!
Буду курить ваш код!

П.С.
(спрашиваю с опаской)
А может все такие есть что-то проще?
...
Рейтинг: 0 / 0
ListBox: Элемент и его ID.
    #37078117
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RegisteredUser А может все такие есть что-то проще?
в элементе словаря оверрайдить метод ToString() - куда уж проще )))
...
Рейтинг: 0 / 0
ListBox: Элемент и его ID.
    #37078202
RegisteredUser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нашел хороший пример реализации для Windows Forms

Код: plaintext
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.
public class awrListItem
{
    /* This class is replacement of ListItem for WindowsForm
     * Example for use:
     * this.ListBox1.Items.Add(new awrListItem("Item 1", 1));
     * this.ListBox1.Items.Add(new awrListItem("Item 2", 2));
     * this.ListBox1.Items.Add(new awrListItem("Item 3", 3));
     */
    private string name;
    private int value;

    public awrListItem(string ItemName, int ItemValue)
    {
        this.name = ItemName.Trim();
        this.value = ItemValue;
    }
    
    public string GetItemName()
    {
        return this.name.Trim();
    }

    public int GetItemValue()
    {
        return this.value;
    }

    public override string ToString()
    {
        return this.name;
    }
}// class WFParameters ----------------------------------------------------------------------------------------------------------------


// так получать доступ 

        private void ListBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
                awrListItem curItem = (awrListItem)ListBox1.SelectedItem;
                MessageBox.Show("ListBox item was changed!" + Environment.NewLine + "SelectedIndex = " + ListBox1.SelectedIndex.ToString()
                    + Environment.NewLine + "Item Name = " + curItem.GetItemName() + Environment.NewLine + "Item ID = " + curItem.GetItemValue().ToString());

        }
На мой взгляд это красивее.
Хотя не понятно почему ни в WPF ни в Window Forms нет стандартного ListItem?
...
Рейтинг: 0 / 0
ListBox: Элемент и его ID.
    #37078222
Руки-крюки
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RegisteredUserКрррасотыщщща!
Хера се что навыдумывали.
Помнится в ASP.Net был простой ListItem для таких целей, а тут така гора букоф.

Ладно! Пасибо на добром слове!
Буду курить ваш код!

П.С.
(спрашиваю с опаской)
А может все такие есть что-то проще?


Есть конечно (override ToString()). Но это вас не научит писать хороший код =)
...
Рейтинг: 0 / 0
ListBox: Элемент и его ID.
    #37078300
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RegisteredUserНа мой взгляд это красивее.
Хотя не понятно почему ни в WPF ни в Window Forms нет стандартного ListItem?и чем это отличается от ListBox1.Items.Add("Элемент"); ?
что такое "стандартный ListItem"? зачем он нужен в W Presentation F?

(похоже, в этом топике каждый разговаривает с самим собой )
...
Рейтинг: 0 / 0
ListBox: Элемент и его ID.
    #37078861
RegisteredUser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
LRRegisteredUserНа мой взгляд это красивее.
Хотя не понятно почему ни в WPF ни в Window Forms нет стандартного ListItem?и чем это отличается от ListBox1.Items.Add("Элемент"); ?
что такое "стандартный ListItem"? зачем он нужен в W Presentation F?

(похоже, в этом топике каждый разговаривает с самим собой )

Тогда задам пару вопросов:
1. Чем приложение на W Presentation F хуже приложения на Window Forms или на ASP.Net?
2. На W Presentation F можно писать бизнес-приложения?
...
Рейтинг: 0 / 0
ListBox: Элемент и его ID.
    #37079018
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RegisteredUserТогда задам пару вопросов
LR(похоже, в этом топике каждый разговаривает с самим собой )
...
Рейтинг: 0 / 0
ListBox: Элемент и его ID.
    #37079024
Фотография Шайтан
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RegisteredUserХера се что навыдумывали.
Помнится в ASP.Net был простой ListItem для таких целей, а тут така гора букоф.[/i]

это не гора букоф, это MVVM!
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / ListBox: Элемент и его ID.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]