Модель представления привязки WPF

Итак, в настоящее время я пытаюсь изучить WPF с MVVM, и я следил за некоторыми онлайн-учебниками. Теперь, когда у меня есть простой проект, я попытался сделать это самостоятельно, но ListBox почему-то остается пустым. Я думаю, что это не связано с ViewModel. Что мне здесь не хватает?

ViewModel:

public class PersonViewModel
{
    ObservableCollection<Person> Personen { get; set; } = new ObservableCollection<Person>();

    public PersonViewModel()
    {
        Personen.Add(new Person { Vorname = "My", Nachname = "Name", Email = "[email protected]" });
        Personen.Add(new Person { Vorname = "Max", Nachname = "Mustermann", Email = "[email protected]" });
        Personen.Add(new Person { Vorname = "John", Nachname = "Doe", Email = "[email protected]" });
        Personen.Add(new Person { Vorname = "Jane", Nachname = "Doe", Email = "[email protected]" });
    }
}

}

Кроме того, я устанавливаю свой DataContext следующим образом:

public PersonenView()
{
    InitializeComponent();
    this.DataContext = new ViewModel.PersonViewModel();
}

В качестве примечания, как правило, вам не следует явно устанавливать DataContext UserControl, как вы это делаете в конструкторе PersonView. Элементы управления UserControl обычно наследуют свой DataContext от своего родительского элемента (например, окна или страницы), а затем либо напрямую привязывают свои дочерние элементы к свойствам унаследованного DataContext, либо имеют свои собственные свойства зависимостей, привязанные к свойствам объекта DataContext.

Clemens 27.05.2019 11:29

@ Клеменс, ты имеешь в виду в моем MainWindow представлении? Я показываю свой пользовательский контроль следующим образом: <views:PersonenView x:Name = "PersonenViewControl" Margin = "20" />. Вы имеете в виду, что я должен установить свойство DataContext внутри этого xaml? Как бы я это сделал?

sLw 27.05.2019 12:44

MainWindow обычно также имеет модель представления, которая имеет свойство PersonViewModel (скажем, PersonVM). Затем вы должны установить DataContext PersonView, например <views:PersonenView DataContext = "{Binding PersonVM}"/>, что не сработает, если PersonView явно установил свой DataContext.

Clemens 27.05.2019 12:48
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
333
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вам просто нужно предоставить открытый доступ к ObservableCollection Personen в вашей ViewModel.

Вы также должны сделать свойство только для чтения (или запустить уведомление об изменении свойства от его установщика):

public ObservableCollection<Person> Personen { get; }
    = new ObservableCollection<Person>();

@sLw Вы даже можете ввести «propfull», а затем вкладку, чтобы создать полное общедоступное свойство с помощью сеттера и геттера.

Ugur 27.05.2019 11:01

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

sLw 27.05.2019 11:13

@ Клеменс ах, хороший совет.

sLw 27.05.2019 11:29

Другие вопросы по теме