Пользовательский интерфейс обновляется только один раз при добавлении нового элемента в ObservableCollection - PullRequest
0 голосов
/ 20 октября 2019

Я столкнулся с действительно странной ошибкой час назад и не смог ее исправить. Мой код содержит коллекцию ObservableCollection, которая привязана к моему представлению (Listview). Я могу добавить новый элемент в свою базу данных, и он будет добавлен в мою коллекцию ObservableCollection. Пользовательский интерфейс обновляется правильно, но только в первый раз. Если я добавлю второй элемент, он появится в моей базе данных, а также в моей коллекции, но мой пользовательский интерфейс больше не обновляется. Может кто-нибудь проверить мой код, чтобы увидеть, если что-то не так?

Просмотр:

<ListView Name="Departments_Listview" ItemsSource="{Binding Departments, UpdateSourceTrigger=PropertyChanged}" SelectedItem="{Binding YourSelectedItem, Mode=TwoWay}" Height="346">
    <ListView.View>
        <GridView>
            <GridViewColumn Header="Department" DisplayMemberBinding="{Binding Department}"/>
        </GridView>
    </ListView.View>
</ListView>

ViewModel

using Autofac;
using Calendar.Commands;
using Calendar.Database.Entities;
using Calendar.Database.Repositories;
using Calendar.Helper_Classes;
using System.Collections.ObjectModel;
using System.Linq;
using System.Threading;
using System.Windows;

namespace Calendar.ViewModels
{
    public class DepartmentViewModel : ViewModelBase
    {
        private RelayCommand command;
        private DepartmentEntity _yourSelectedItem;
        ObservableCollection<DepartmentEntity> _Departments = new ObservableCollection<DepartmentEntity>();
        public DepartmentViewModel()
        {
        }
        public ObservableCollection<DepartmentEntity> Departments
        {
            get
            {
                var container = ContainerConfig.Configure();
                using (var scope = container.BeginLifetimeScope())
                {
                    var test = scope.Resolve<IDepartmentRepository>();
                    _Departments = test.GetAll().ToObservable();
                }
                return _Departments;
            }
            set
            {
                _Departments = value;
                NotifyPropertyChanged("Departments");
            }
        }

        private string department;

        public string Department
        {
            get { return department; }
            set
            {
                department = value;
                NotifyPropertyChanged("Department");
            }
        }
        public DepartmentEntity YourSelectedItem
        {
            get
            {
                return _yourSelectedItem;
            }
            set
            {
                if (value != null)
                {
                    Department = value.Department;
                }
                _yourSelectedItem = value;
                NotifyPropertyChanged("YourSelectedItem");
            }
        }
        private void NewDepartment()
        {
            var container = ContainerConfig.Configure();
            using (var scope = container.BeginLifetimeScope())
            {
                var NewDepartment = scope.Resolve<IDepartmentRepository>();
                DepartmentEntity newDepartment = new DepartmentEntity
                {
                    Department = "Bitte ändern"
                };
                NewDepartment.Add(newDepartment);
                int DepartmentId = NewDepartment.Count();
                _Departments.Add(
                    new DepartmentEntity()
                    {
                        Id = DepartmentId,
                        Department = "Bitte ändern"
                    });
            }
        }
    }
}

1 Ответ

1 голос
/ 20 октября 2019

Попробуйте добавить NotifyPropertyChanged("Departments"); после добавления нового элемента, например, после

 _Departments.Add(
     new DepartmentEntity()
     {
         Id = DepartmentId,
         Department = "Bitte ändern"
     });

Это позволяет UI понять, что свойство Departments было обновлено. Вы также можете подумать об избавлении от этого кода в Departments getter

var container = ContainerConfig.Configure();
using (var scope = container.BeginLifetimeScope())
{
      var test = scope.Resolve<IDepartmentRepository>();
      _Departments = test.GetAll().ToObservable();
}

, поскольку вы уже добавили новый элемент в _Departments поле поддержки

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...