0

Есть класс 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
  • Как вы и написали, у меня есть такое в коде public partial class MainWindow : Window { ViewModel Model = new ViewModel();

    При нажатии на кнопку

    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
  • Я ведь дал вам ссылку на полноценный ответ почему так, как делаете вы - делать нельзя, там же и примеры того, как надо делать. Читайте внимательней. – EvgeniyZ Aug 31 '22 at 16:20
  • Хочу сказать, вам, спасибо. Не сразу, но разобрался в своей ошибке. Теперь немного лучше разбираюсь в этой теме) Спасибо, что указали направление, где искать ответ) P.s По вашему первому ответу понял, что у меня 2 класса, но не понимал, как это исправить – Сергей Sep 04 '22 at 06:52

0 Answers0