Есть класс User и класс ViewModel с ObservableCollection. В ListView необходимо отобразить эту коллекцию, но, при добавлении новых объектов в коллекцию в ListView ничего не отображается. PropertyChange вроде реализовал, но не сильно понимаю, как он работает. Подскажите, пожалуйста, где я допустил ошибку. Заранее спасибо.
public class ViewModel : INotifyPropertyChanged
{
public ObservableCollection<User> _users;
public ObservableCollection<User> Users
{
get
{
return _users ?? (_users = new ObservableCollection<User>());
}
set
{
if (_users != value)
{
_users = value;
OnPropertyChanged(nameof(Users));
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged([CallerMemberName] string propertyName = "")
{
if (PropertyChanged != null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
public ViewModel()
{
Users = new ObservableCollection<User>();
}
}
public class User
{
public string FirstName { get; set; }
public string LastName { get; set; }
public string Email { get; set; }
public string UserName { get; set; }
public string Password { get; set; }
public int Department { get; set; }
public User (string firstName, string lastName, string email, string userName, string password, int department)
{
FirstName = firstName;
LastName = lastName;
Email = email;
UserName = userName;
Password = password;
Department = department;
}
}
XAML
<ListView Name="UserList" ItemsSource="{Binding Users, UpdateSourceTrigger=PropertyChanged}" Grid.Row="1" Grid.RowSpan="2" Grid.ColumnSpan="6" Margin="5">
<ListView.View>
<GridView>
<GridViewColumn DisplayMemberBinding="{Binding UserName }">
<GridViewColumn.Header>
<GridViewColumnHeader>
<TextBlock Text="User Name" FontWeight="Bold"/>
</GridViewColumnHeader>
</GridViewColumn.Header>
</GridViewColumn>
<GridViewColumn DisplayMemberBinding="{Binding FirstName}">
<GridViewColumn.Header>
<GridViewColumnHeader>
<TextBlock Text="First Name" FontWeight="Bold"/>
</GridViewColumnHeader>
</GridViewColumn.Header>
</GridViewColumn>
<GridViewColumn DisplayMemberBinding="{Binding LastName }">
<GridViewColumn.Header>
<GridViewColumnHeader>
<TextBlock Text="Last Name" FontWeight="Bold"/>
</GridViewColumnHeader>
</GridViewColumn.Header>
</GridViewColumn>
<GridViewColumn DisplayMemberBinding="{Binding Email }">
<GridViewColumn.Header>
<GridViewColumnHeader>
<TextBlock Text="Email" FontWeight="Bold"/>
</GridViewColumnHeader>
</GridViewColumn.Header>
</GridViewColumn>
<GridViewColumn DisplayMemberBinding="{Binding Department }">
<GridViewColumn.Header>
<GridViewColumnHeader>
<TextBlock Width="Auto" Text="Deparment" FontWeight="Bold"/>
</GridViewColumnHeader>
</GridViewColumn.Header>
</GridViewColumn>
</GridView>
</ListView.View>
</ListView>
Ресурсы подгружены через XAML
<Window.DataContext>
<local:ViewModel/>
</Window.DataContext>
ViewModel vm = new(); vm.Users.Add(...);, то поздравляю, у вас 2 экземпляра классаViewModel, где UI привязан к одному, а данные вы меняете в другом. – EvgeniyZ Aug 31 '22 at 15:26При нажатии на кнопку
User user = new User(FirstNameTextBox.Text, LastNameTextBox.Text, EmailTextBox.Text, UserNameTextBox.Text, PasswordBox.Password, DepartmentComboBox.SelectedIndex); Model.Users.Add(user);
Подскажите, пожалуйста, что в таком случае нужно изменить? Нужно сделать класс ViewModel абстрактным?
– Сергей Aug 31 '22 at 16:05