Как привязать список к древовидной структуре WPF с помощью Xaml?

Я не знаю, как привязать список напитков к WPF TreeView.

struct Drink
{
    public string Name { get; private set; }
    public int Popularity { get; private set; }

    public Drink ( string name, int popularity )
        : this ( )
    {
        this.Name = name;
        this.Popularity = popularity;
    }
}

List<Drink> coldDrinks = new List<Drink> ( ){
    new Drink ( "Water", 1 ),
    new Drink ( "Fanta", 2 ),
    new Drink ( "Sprite", 3 ),
    new Drink ( "Coke", 4 ),
    new Drink ( "Milk", 5 ) };
        }
    }

Я искал в Интернете, например, видел здесь . Но что это вообще значит: ItemsSource="{x:Static local:TreeTest.BoatList}"

x:? static? local?

Как указать коллекцию в коде в xaml?


person Joan Venge    schedule 20.03.2010    source источник
comment
Ваши данные не иерархичны. Вы действительно хотите использовать TreeView? В данном случае это не имеет особого смысла. Я думаю, что ListBox или ListView с установленной сортировкой на popularity будет иметь больше смысла.   -  person Benny Jobigan    schedule 20.03.2010
comment
Спасибо, вы правы, но я начинаю с простого, потому что не знаю wpf, но позже фактически заменю данные иерархическими.   -  person Joan Venge    schedule 20.03.2010
comment
@Benny: Этот вопрос был поднят и по этому вопросу: stackoverflow.com/questions/2481010/   -  person Reed Copsey    schedule 20.03.2010
comment
@ Рид Хм, да. Неудивительно, поскольку оба вопроса почти идентичны и задаются одним и тем же человеком.   -  person Benny Jobigan    schedule 20.03.2010


Ответы (1)


Как правило, вам нужно обязательно установить DataContext для UserControl или Window, а затем сделать так, чтобы ваши "coldDrinks" были коллекцией, определенной как свойство в вашем классе DataContext.

Если вы сделаете это, то все, что вам потребуется, это:

<TreeView ItemsSource="{Binding ColdDrinks}" />

Я настоятельно рекомендую ознакомиться с моделью привязки данных WPF. Понимание этого - один из ключей к тому, чтобы сделать WPF действительно приятным.


Замечание: учитывая ваши недавние вопросы и подход, который вы, похоже, используете, вы можете подумать о том, чтобы потратить немного времени, чтобы прочитать о MVVM и других архитектурных подходах. Даже если вы не используете MVVM, статьи с его описанием могут помочь вам «подумать» о терминологии WPF, что очень поможет.

Я написал целую серию статей о переходе с программирования в стиле Windows Forms на WPF. В нем обсуждаются конкретные функции WPF и причины, по которым вы должны изменить свой образ мышления, но некоторые концепции вводятся немного медленнее, чем в большинстве чистых статей о MVVM. Подумал, я бы упомянул об этом, если это поможет.

person Reed Copsey    schedule 20.03.2010
comment
Спасибо, как вы делаете первое, о чем упомянули? Как правило, вы хотите удостовериться .... Обязательно ли мне это делать? - person Joan Venge; 20.03.2010
comment
Мои coldDrinks находится внутри Window1 как значение экземпляра. Когда я его запустил, он вообще не показывает никаких элементов. Должен ли он быть статичным? - person Joan Venge; 20.03.2010
comment
@Joan: Вы можете просто сделать это. DataContext = this; в вашем конструкторе, в коде позади, если хотите. Тем не менее, я настоятельно рекомендую прочитать статьи, которые я опубликовал в своем обновлении - это поможет тонне понять, ПОЧЕМУ вы хотите делать некоторые из этих вещей, вместо того, чтобы просто пытаться возиться с тем, чтобы все работало ... - person Reed Copsey; 20.03.2010
comment
@ Джоан: Нет. Это не обязательно должно быть статичным. Это ОБЯЗАТЕЛЬНО должно быть свойство, а не поле. Кроме того, если вы не используете ObservableCollection ‹T› вместо List ‹T›, вам необходимо убедиться, что элементы существуют до загрузки окна, иначе привязка не будет работать должным образом ... - person Reed Copsey; 20.03.2010
comment
Спасибо, я их прочту. Вероятно, только ваша последняя ссылка, потому что я не хочу читать сотни страниц, прежде чем я смогу начать что-либо делать, или я просто остыл к wpf. - person Joan Venge; 20.03.2010
comment
@Joan: Последняя ссылка, которую я написал - это действительно введение в WPF и MVVM для разработчиков Windows Forms. Думаю, это действительно поможет :) - person Reed Copsey; 20.03.2010
comment
Так ты хочешь сказать, что у меня не может быть чего-то подобного? публичный список ‹Drink› list = новый список ‹Drink› (); Это должна быть недвижимость? - person Joan Venge; 20.03.2010
comment
Xaml не так уж и сложен, вы правы, но по некоторым концепциям я понятия не имею, что происходит. - person Joan Venge; 20.03.2010
comment
@ Джоан: Да. Привязка данных работает только со свойствами в WPF. И я согласен - XAML довольно прост, но понять, почему вы хотите использовать определенные вещи и когда / как использовать определенные функции, сложно. Здесь действительно помогает понимание некоторых шаблонов проектирования, таких как MVVM. - person Reed Copsey; 20.03.2010
comment
Но действительно ли MVVM сложно изучить? Если я не смогу за короткое время преобразовать некоторые из моих инструментов из форм widows в wpf, то преобразовать их вообще будет сложно. - person Joan Venge; 20.03.2010
comment
@Joan: Нет. Этому нетрудно научиться. Даже если вы не используете его, стоит понять, почему так много людей это делают. MVVM - это просто, если вы поймете пару основ WPF. Я бы посоветовал прочитать мои статьи, и если у вас все еще есть вопросы, оставляйте там комментарии (к конкретным сообщениям), и я буду рад ответить. Кроме того, я уверен, что это вызовет другие хорошие вопросы SO;) - person Reed Copsey; 20.03.2010
comment
@Joan: Я подозреваю, что вы сэкономите больше времени, даже в краткосрочной перспективе, если поймете, ПОЧЕМУ использовать методы в WPF ... MVVM помогает в этом. - person Reed Copsey; 20.03.2010
comment
Спасибо, Рид. Я прочитаю ваши материалы на этих выходных и дам вам знать, если я чего-то там не пойму: O - person Joan Venge; 20.03.2010