У меня есть ObservableCollection в ViewModel, который добавляет новые записи при нажатии кнопки ApplicationBar в View. ListBox, который привязан к этому ObservableCollection, не показывает новую / обновленную запись, он показывает элементы коллекции при загрузке приложения. ViewModel действительно реализует INotifyPropertyChanged, и я вызываю NotifyPropertyChanged, когда элемент добавляется в набор ObservableCollection (или).
ViewModel - на основе того, что считывается с сервера, новые элементы добавляются в наблюдаемую коллекцию.
public class MainViewModel : INotifyPropertyChanged
{
private ObservableCollection<SubsViewModel> _itemsUnread;
public ObservableCollection<SubsViewModel> UnreadItems
{
get
{
return _itemsUnread;
}
set
{
_itemsUnread = value;
NotifyPropertyChanged("Updated");
}
}
void reader_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
switch (e.PropertyName)
{
case "Updated":
Deployment.Current.Dispatcher.BeginInvoke(() =>
{
UnreadItems.Clear();
foreach (ItemViewModel subs in ItemsAll)
{
....
UnreadItems.Add(subs);
}
}
);
IsDataUpdated = true;
NotifyPropertyChanged(e.PropertyName);
break;
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(String propertyName)
{
if (null != this.PropertyChanged)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
view - устанавливает datacontext и itemsource
<ListBox x:Name="SecondListBox" Margin="0,0,-12,0" ItemsSource="{Binding UnreadItems, Mode=TwoWay}">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Margin="0,0,0,7">
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding ItemTitle}" TextWrapping="NoWrap" Margin="12,0,0,0" Style="{StaticResource PhoneTextLargeStyle}"/>
...
public MainPage()
{
_mainView = new MainViewModel();
InitializeComponent();
// Set the data context of the listbox control to the sample data
DataContext = _mainView;
this.Loaded += new RoutedEventHandler(MainPage_Loaded);
}
Любое добавление / обновление наблюдаемой коллекции в viewModel не отражается в списке. Я прочитал кучу мест, где notifypropertychanged - это решение, но у меня уже есть notifypropertychanged, и я все еще вижу проблему. Есть идеи, что мне не хватает?
Из предложения @ compoenet_tech путем добавления нового элемента при нажатии кнопки ApplicationBar. Я вижу, что в списке отображается новый элемент
SubsViewModel newitem = new SubsViewModel();
newitem.itemTitle = "test";
newitem.itemCount = test;
_itemssUnread.Add(newitem); test++;
Итак, выполнение Add () вне Dispatcher Invoke действительно работает. Но теперь проблема в том, что я получаю новый список из веб-службы с помощью обратного вызова, и именно здесь я добавляю записи в коллекцию unreaditems. что я не могу (??) делать вне диспетчера.
(web service) =callback=> ViewModel =observablecollection=> View
как viewmodel получает уведомление об обновлении коллекции за пределами обратного вызова, когда мне не нужно использовать вызов диспетчера? (или) использовать вызов диспетчера и не допускать сбоев из-за перекрестной ссылки.
Спасибо