Я новичок в 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>
У меня вопрос, как мне получить этоработать.Мне нужно поменять местами представления в зависимости от того, установлен флажок «Избранное» или нет.