Привязка ListBox не обновляется при обмене ObservableCollection даже на INotifyPropertyChanged - PullRequest
0 голосов
/ 27 июля 2011

Я новичок в WPF.Я реализовал решение MV-VM и реализовал INotifyPropertyChanged для всех свойств, которые должны отражаться в пользовательском интерфейсе.Кажется, что пока все работает нормально, за исключением списка, привязанного к свойству только для чтения, которое возвращает наблюдаемую коллекцию.

ViewModelBase реализует интерфейс INotifyPropertyChanged:

public abstract class ViewModelBase : INotifyPropertyChanged
{
    .....
    INotifyPropertyChanged Implementation
    .....

    OnPropertyChanged(...)
    {
        .....
    }  
}

наследует класс MainViewModelViewModelBase и содержит данные для пользовательского интерфейса (View).BackgroundWorker создает объекты UserViewModel.Объекты добавляются в коллекцию ObservableCollection.ListBox отображает UserViewModel ObservableCollection.

По мере создания объекта User он добавляется в ObservableCollection, и вызывается OnPropertyChanged для уведомления элементов пользовательского интерфейса об обновлении.Это работает нормально.

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

public class MainViewModel : ViewModelBase
{    
    private ObservableCollection<UserViewModel> mUsers = new ObservableCollection<UserViewModel>();
    private ObservableCollection<UserViewModel> mFavoriteUsers = new ObservableCollection<UserViewModel>();
    UserViewModel mSelectedUser;
    private bool mbShowFavorite;

    public bool ShowFavorite
    {
        get { return this.mbShowFavorite; }
        set
        {
            this.mbShowFavorite = value;
            OnPropertyChanged("ShowFavorite");
            OnPropertyChanged("Users");
        }
    }

    public UserViewModel SelectedUser
    {
        get { return this.mSelectedUser; }
        set
        {
            this.mSelectedUser = value;
            OnPropertyChanged("SelectedUser");
        }
    }

    public ObservableCollection<UserViewModel> Users
    {
        get 
        {
            if (this.mbShowFavorite)
                return this.mFavoriteUsers;
            else
                return this.mUsers;
        }
    }

    .....
    Other Class Members
    .....

    void BackgroundCreateUserModelsCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        // Add the User View Model
        this.mUsers.Add((UserViewModel)e.Result);

        if (((UserViewModel)e.Result).IsFavorite)
        {
            this.mFavoriteUsers.Add((UserViewModel)e.Result);
        }

        // Users changed: Notify Property Changes
        OnPropertyChanged("Users");
    }
}

Вот представление XAML, относящееся к приведенному выше коду.

<CheckBox VerticalAlignment="Center" Content="Show Favorites"
    IsChecked="{Binding Path=ShowFavorite, Mode=TwoWay}" />

<ListBox Name="listboxUsers"
    ItemsSource="{Binding Path=Users}" 
    SelectedItem="{Binding SelectedUser, Mode=TwoWay}">            
    <ListBox.ItemTemplate>
        <DataTemplate>
            <views:UserView></views:UserView>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>    

У меня вопрос, как мне получить этоработать.Мне нужно поменять местами представления в зависимости от того, установлен флажок «Избранное» или нет.

1 Ответ

0 голосов
/ 27 июля 2011

Проблема может быть связана с тем, что изменения коллекции не передаются в поток пользовательского интерфейса.Для получения дополнительной информации см. Проверка того, что OnPropertyChanged () вызывается в потоке пользовательского интерфейса в приложении MVVM WPF .

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