Итак, в настоящее время я пытаюсь изучить 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();
}
@ Клеменс, ты имеешь в виду в моем MainWindow
представлении? Я показываю свой пользовательский контроль следующим образом: <views:PersonenView x:Name = "PersonenViewControl" Margin = "20" />
. Вы имеете в виду, что я должен установить свойство DataContext внутри этого xaml? Как бы я это сделал?
MainWindow обычно также имеет модель представления, которая имеет свойство PersonViewModel (скажем, PersonVM
). Затем вы должны установить DataContext PersonView, например <views:PersonenView DataContext = "{Binding PersonVM}"/>
, что не сработает, если PersonView явно установил свой DataContext.
Вам просто нужно предоставить открытый доступ к ObservableCollection Personen в вашей ViewModel.
Вы также должны сделать свойство только для чтения (или запустить уведомление об изменении свойства от его установщика):
public ObservableCollection<Person> Personen { get; }
= new ObservableCollection<Person>();
@sLw Вы даже можете ввести «propfull», а затем вкладку, чтобы создать полное общедоступное свойство с помощью сеттера и геттера.
@Ugur это то, что я обычно делаю, посмотри мою модель. Но с этой коллекцией я собирался использовать автоматическое свойство вручную. Вот почему я забыл сделать это общедоступным
@ Клеменс ах, хороший совет.
В качестве примечания, как правило, вам не следует явно устанавливать DataContext UserControl, как вы это делаете в конструкторе PersonView. Элементы управления UserControl обычно наследуют свой DataContext от своего родительского элемента (например, окна или страницы), а затем либо напрямую привязывают свои дочерние элементы к свойствам унаследованного DataContext, либо имеют свои собственные свойства зависимостей, привязанные к свойствам объекта DataContext.