Пытаясь создать ListBox с помощью WPF, и я хочу заполнить членов по коду - PullRequest
1 голос
/ 13 июня 2011

Я пытаюсь узнать, как с этого сайта http://msdn.microsoft.com/en-us/library/cc265158(v=vs.95).aspx, но код не скомпилируется, и я получаю тонны ошибок.

Вот мой код

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Bail
{
    public class ListboxMenuItem
    {
        public String FirstName { get; set; }
        public String LastName { get; set; }
        public String Address { get; set; }

        public ListboxMenuItem(String firstName, String lastName, String address)
        {
            this.FirstName = firstName;
            this.LastName = lastName;
            this.Address = address;
        }
    }

    class ListboxMenuItems
    {
        List<ListboxMenuItem> Items;

        Items = new List<ListboxMenuItem>();
        Items.Add(new ListboxMenuItem("Michael", "Anderberg", "12 North Third Street, Apartment 45"));
        Items.Add(new ListboxMenuItem("Chris", "Ashton", "34 West Fifth Street, Apartment 67"));
        Items.Add(new ListboxMenuItem("Cassie", "Hicks", "56 East Seventh Street, Apartment 89"));
        Items.Add(new ListboxMenuItem("Guido", "Pica", "78 South Ninth Street, Apartment 10"));

    }
}

Все ошибки с элементами

Например, Items = new List<ListboxMenuItem>(); выдает ошибку

Ошибка 1 Неправильный токен'=' в объявлении члена класса, структуры или интерфейса ListboxMenuItems.cs 26 15 Залог

1 Ответ

5 голосов
/ 13 июня 2011

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

Новый ответ

Я только что посмотрел на ссылку, и кажется, что вы все равно делаете не так.
Вам нужен ваш класс для наследования от ObservableCollection<T>, и вместо поля / свойства List вы должны использовать функциональность базового класса (в котором уже есть метод Add):

class ListboxMenuItems : ObservableCollection<ListboxMenuItem>
{
    public ListboxMenuItems ()
    {        
        // 'Add' here means 'base.Add'
        Add (new ListboxMenuItem ("Michael", "Anderberg", "12 North Third Street, Apartment 45"));
        Add (new ListboxMenuItem ("Chris", "Ashton", "34 West Fifth Street, Apartment 67"));
        Add (new ListboxMenuItem ("Cassie", "Hicks", "56 East Seventh Street, Apartment 89"));
        Add (new ListboxMenuItem ("Guido", "Pica", "78 South Ninth Street, Apartment 10"));
    }
}

Все это четко написано в предоставленной вами ссылке, поэтому вам следует быть осторожнее с принятием кода из документации.

Старый ответ

Вы поместили код инициализации прямо в объявление класса, где обычно размещаются методы, поля и свойства.

Код инициализации помещается в специальный метод с именем ctor constructor ’, имя которого совпадает с именем класса, не имеет возвращаемого типа и помещается внутри соответствующего класса:

class ListboxMenuItems
{
    public List<ListboxMenuItem> Items { get; private set; }

    public ListboxMenuItems ()
    {        
        Items = new List<ListboxMenuItem> {
            new ListboxMenuItem ("Michael", "Anderberg", "12 North Third Street, Apartment 45"),
            new ListboxMenuItem ("Chris", "Ashton", "34 West Fifth Street, Apartment 67"),
            new ListboxMenuItem ("Cassie", "Hicks", "56 East Seventh Street, Apartment 89"),
            new ListboxMenuItem ("Guido", "Pica", "78 South Ninth Street, Apartment 10")
        };
    }
}

Я изменил Items с поля на свойство. Это лучший метод, потому что вы можете указать, кто может его изменить (в нашем случае private set позволяет установить его только из ListboxMenuItems).

Я также использовал синтаксис инициализатора списка, который позволяет отбрасывать многие вызовы Add в пользу более чистого, беспрепятственного синтаксиса.

...