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

Я хочу загружать в ListBox данные из таблицы-словаря, т.е. соответствие "ИмяЭлемента - IDЭлемента"
Например такое:
авторГород = 11
Поселок = 21
...
Хутор = 130
С загрузкой "ИмениЭлемента" проблем нет - ListBox1.Items.Add("ИмяЭлемента");
А как поставить в ListBox1 в соответсвие каждому"ИмениЭлемента" еще и IDЭлемента.
Т.е. при клике на каждом элементе ListBox1 я хочу помимо Названия Элемента еще получать его ID.
Как это делается в WPF?
...
Рейтинг: 0 / 0
25.01.2011, 12:19
    #37077219
LR
LR
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ListBox: Элемент и его ID.
загружать в список (подсовывать источник элементов 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
25.01.2011, 16:35
    #37077894
Руки-крюки
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ListBox: Элемент и его ID.
На таком простом примере есть отличная возможность освоить 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
25.01.2011, 17:39
    #37078047
RegisteredUser
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ListBox: Элемент и его ID.
Крррасотыщщща!
Хера се что навыдумывали.
Помнится в ASP.Net был простой ListItem для таких целей, а тут така гора букоф.

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

П.С.
(спрашиваю с опаской)
А может все такие есть что-то проще?
...
Рейтинг: 0 / 0
25.01.2011, 18:01
    #37078117
LR
LR
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ListBox: Элемент и его ID.
RegisteredUser А может все такие есть что-то проще?
в элементе словаря оверрайдить метод ToString() - куда уж проще )))
...
Рейтинг: 0 / 0
25.01.2011, 18:37
    #37078202
RegisteredUser
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ListBox: Элемент и его ID.
Нашел хороший пример реализации для 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
25.01.2011, 18:49
    #37078222
Руки-крюки
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ListBox: Элемент и его ID.
RegisteredUserКрррасотыщщща!
Хера се что навыдумывали.
Помнится в ASP.Net был простой ListItem для таких целей, а тут така гора букоф.

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

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


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

(похоже, в этом топике каждый разговаривает с самим собой )
...
Рейтинг: 0 / 0
26.01.2011, 09:50
    #37078861
RegisteredUser
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ListBox: Элемент и его ID.
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
26.01.2011, 10:55
    #37079018
LR
LR
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ListBox: Элемент и его ID.
RegisteredUserТогда задам пару вопросов
LR(похоже, в этом топике каждый разговаривает с самим собой )
...
Рейтинг: 0 / 0
26.01.2011, 10:57
    #37079024
Шайтан
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ListBox: Элемент и его ID.
RegisteredUserХера се что навыдумывали.
Помнится в ASP.Net был простой ListItem для таких целей, а тут така гора букоф.[/i]

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


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