Привязать коллекцию объектов к ListBox - PullRequest
2 голосов
/ 26 февраля 2012

У меня есть класс Person:

    public class Person : INotifyPropertyChanged
    {

        private String name = "";
        public event PropertyChangedEventHandler PropertyChanged;

        public Person()
        {
            NameProperty = "hi";
        }

        public Person(String _name)
        {
            NameProperty = _name;
        }

        public String NameProperty
        {
            get { return name; }
            set 
            { 
                name = value;
                OnPropertyChanged("NameProperty");
            }
        }

        public override String ToString()
        {
            return NameProperty;
        }

        protected void OnPropertyChanged(string name)
        {

            PropertyChangedEventHandler handler = PropertyChanged;

            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(name));
            }

        }

    }

И я могу привязать экземпляр моего класса к TextBox:

myPerson = new Person("demas");
Binding myBinding = new Binding("NameProperty");
myBinding.Source = myPerson;
txtName.SetBinding(TextBox.TextProperty, myBinding);

Теперь у меня есть коллекция моего класса, и я хочу привязать ее к ListBox:

List<Person> myCollection = new List<Person>(); // on the MainWindow level

myCollection.Add(new Person("one"));
myCollection.Add(new Person("two"));
myCollection.Add(new Person("three"));

Итак, я должен увидеть в ListBox три значения: одно, два, три. Как я могу это сделать?

Ответы [ 2 ]

6 голосов
/ 26 февраля 2012

Экспонируйте свою коллекцию как публичную собственность в вашем MainWindow.Если вы хотите, чтобы ваш ListBox обновлялся при добавлении или удалении элементов в вашу коллекцию, вы должны использовать ObservableCollection<T> вместо List<T>.

readonly ObservableCollection<Person> myCollection = new ObservableCollection<Person>();

public ObservableCollection<Person> MyCollection
{
    get { return myCollection; }
} 

Затем в своем XAML используйте данныепривязка для ссылки на свойство:

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:l="clr-namespace:WpfApplication1"
        xmlns:p="clr-namespace:WpfApplication1.Properties"
        DataContext="{Binding RelativeSource={RelativeSource Self}}"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <ListBox ItemsSource="{Binding MyCollection}">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding NameProperty}" />
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
    </Grid>
</Window>

Не забудьте установить DataContext либо в ListBox, либо в его родительском окне.

Имена идентификаторов PS должны определять цельне тип.Используйте Persons вместо MyCollection;используйте Name вместо NameProperty.

3 голосов
/ 26 февраля 2012

Используйте ObservableCollection вместо List.Это обновит пользовательский интерфейс при добавлении / удалении элементов в / из коллекции.Получив коллекцию, привяжите ее к свойству ItemsSource объекта ListBox.

Кроме того, вы можете контролировать способ визуализации объектов Person в пользовательском интерфейсе, переопределив метод ToString в классе Person или установив ItemTemplate в элементе управления ListBox.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...