2016-12-22 2 views
0

У меня есть приложение для рабочего стола wpf.combo box не обновляется, когда наблюдаемые изменения коллекции

У меня есть раскрывающийся список, и его источник элементов установлен в наблюдаемую коллекцию.

Целью является отображение списка пользователей. У меня есть кнопка в этой форме, которая удалит выбранного пользователя. Он устанавливает поле 'Active' в '0', где '1' не удаляется.

Проблема в том, что хотя я вижу, что наблюдаемая коллекция была уменьшена на 1. Но визуально выпадающий список показывает все исходные состояния пользователя.

Это моя XAML:

<ComboBox ItemsSource="{Binding Users}" DisplayMemberPath="Login" 
       SelectedValue="{Binding SelectedManagerUser}" /> 

Это бит VM его:

public ObservableCollection<UserRecord> Users 
{ 
    get 
    { 
     return (from users in UserRecord.Get().Where(d => d.Active == 1) 
        select new UserRecord 
        { 
         FName = users.FName, 
         SName = users.SName, 
         UserRecordId = users.UserRecordId, 
         Login = users.Login, 
         IsAdmin = users.IsAdmin, 
         UserRef = users.UserRef, 
         Disabled = users.Disabled, 
         Branch = users.Branch, 
         Department = users.Department, 
         Position = users.Position,         
         Salt = users.Salt, 
        }).OrderBy(d => d.Login).ToList(); 

    } 
    set { 
     _Users = value; RaisePropertyChanged(InformedWorkerCommon.Constants.VM_Users); } 
} 

Мой ПОКО/Модель:

public class UserRecord 
{ 
    public int UserRecordId { get; set; } 
    public string FName { get; set; } 
    public string SName { get; set; } 
    public string Login { get; set; } 
    public string Salt { get; set; } 
    public int IsAdmin { get; set; } 
    public string UserRef { get; set; } 
    public int Disabled { get; set; } 
    public string Branch { get; set; } 
    public string Position { get; set; } 
    public int Active { get; set; } 
    public string Department { get; set; } 
    public string ServerRef { get; set; } 
    public DateTime ServerTS { get; set; } 
} 

Это код, который устанавливает Активное поле к «0»:

мой тест включает в себя предварительную загрузку с 2 пользователей

private void DeleteUser() 
{ 
    try 
    { 

в этот момент пользователи подсчитывать является 2

 UserRecord.Save(new UserRecord() 
       { 
        UserRef=UserRef, 
        Branch = Branch, 
        Department = Department, 
        Disabled = Disabled == true ? 1 : 0, 
        FName = FName, 
        IsAdmin = 0, 
        Login = Login, 
        Position = Position, 
        SName = SName, 
        Active = 0,       
       }); 

в данный момент сосчитать пользователей является 1, но выпадающие все еще показывает 2 пользователей

   DisplayInfoMessage(Properties.Resources.Deleted); 
      } 
     } 
    } 
    catch (Exception ex) 
    { 
     //handle the error 
    } 
} 

Я относительно новым для Wp f, чтобы я мог сделать правильный ревун здесь?

+0

Является ли значение InformedWorkerCommon.Constants.VM_Users «Пользователями», чтобы уведомить об этом поле со списком? Кажется, вы не устанавливаете свойство в любом месте, так как ваш получатель просто все еще читает из базы данных. Вам не нужен сеттер для свойства Users, достаточно сообщить, что правильная привязка была изменена из функции удаления. –

+0

Я немного удивлен, что метод 'Delete()' реализуется как 'Сохранить (новый UserRecord {...})'. Однако, предполагая, что 'Save' будет по-прежнему поступать правильно, возможно, вам нужно только обновить' Binding' в '' ComboBox''. 'ObservableCollection' не будет уведомлять автоматически, когда изменилось только свойство элемента. Я думаю, что здесь будет полезен код 'UserRecord.Save'. – wkl

+0

Привет, спасибо за ваше предложение.Существует причина, по которой удаление происходит так, как есть, и, возможно, все по неправильным причинам :) Я проверю, когда вернусь в офис. Спасибо u –

ответ

1

Вы должны создать один один экземпляр вашего ObservableCollection и добавить и удалить элементы из этого единственного экземпляра.

Вы можете создать коллекцию в конструкторе модели представления и реализация имущества в качестве простого автоматического реализованного свойства только для чтения, например:

public class ViewModel 
{ 
    public ViewModel() 
    { 
     Users = new ObservableCollection<UserRecord>((from users in UserRecord.Get().Where(d => d.Active == 1) 
                 select new UserRecord 
                 { 
                  FName = users.FName, 
                  SName = users.SName, 
                  UserRecordId = users.UserRecordId, 
                  Login = users.Login, 
                  IsAdmin = users.IsAdmin, 
                  UserRef = users.UserRef, 
                  Disabled = users.Disabled, 
                  Branch = users.Branch, 
                  Department = users.Department, 
                  Position = users.Position, 
                  Salt = users.Salt, 
                 }).OrderBy(d => d.Login).ToList()); 
    } 

    public ObservableCollection<UserRecord> Users { get; } 

} 

Тогда ComboBox привязан к собственности пользователей получит обновляется по мере добавления или удаления элементов из исходной коллекции. Но вы не должны создавать новый ObservableCollection каждый раз, когда вызывается getter свойства source.

+0

Спасибо, что просветили меня. Счастливого Рождества :) –