1

我有一個ObservableCollection,這是實現INotifyPropertyChanged接口視圖模型的集合...LongListSelector必然的ObservableCollection不更新

public class FeedsViewModel : ObservableCollection<FeedViewModel> 
{ 
} 

(我還沒有爲FeedViewModel的代碼,但它是相當標準INotifyPropertyChanged並且在獨立測試時結合)。

我使用的FeedsViewModel實例作爲一個LongListSelector控制的ItemsSource ...

<UserControl.Resources> 
    <viewModel:FeedStatusFeedbackConverter x:Key="ProgressStatusColorConverter"/> 
    <viewModel:FeedStatusFeedbackConverter x:Key="TitleStatusColorConverter"/> 
    <viewModel:FeedsViewModel x:Key="FeedsViewModel"/> 
</UserControl.Resources> 

<phone:LongListSelector ItemsSource="{Binding Source={StaticResource FeedsViewModel}}"> 
    <phone:LongListSelector.ItemTemplate> 
     <DataTemplate> 

      <Grid x:Name="LayoutRoot" 
        Background="{StaticResource PhoneChromeBrush}" 
        DataContext="{TemplateBinding}"> 
       <Grid.ColumnDefinitions> 
        <ColumnDefinition Width="*"/> 
        <ColumnDefinition Width="Auto"/> 
       </Grid.ColumnDefinitions> 

       <Grid Grid.Column="0"> 
        <Grid.RowDefinitions> 
         <RowDefinition Height="Auto"/> 
         <RowDefinition Height="Auto"/> 
         <RowDefinition Height="Auto"/> 
        </Grid.RowDefinitions> 

        <TextBlock Text="{Binding Path=Name}" 
           Grid.Row="0" 
           Style="{StaticResource PhoneTextLargeStyle}" 
           Foreground="{Binding Path=Status, Converter={StaticResource TitleStatusColorConverter}}"/> 
        <TextBlock Text="{Binding Path=Uri}" 
           Grid.Row="1" 
           Style="{StaticResource PhoneTextNormalStyle}" 
           TextTrimming="WordEllipsis" /> 
        <ProgressBar Grid.Row="2" 
           Maximum="{Binding Path=ItemCount}" 
           Value="{Binding Path=ItemProgress}" 
           Foreground="{Binding Path=Status, Converter={StaticResource ProgressStatusColorConverter}}"> 
        </ProgressBar> 
       </Grid> 

       <Grid Grid.Column="1"> 
        <Image Name="Delete" 
          Source="/Assets/Buttons/delete.png" 
          Width="48" 
          Height="48" 
          Margin="5" 
          MouseLeftButtonDown="Press" 
          MouseLeftButtonUp="Release"/> 
       </Grid> 
      </Grid> 

     </DataTemplate> 
    </phone:LongListSelector.ItemTemplate> 
</phone:LongListSelector> 

然而,當我在運行時添加一些東西到的ObservableCollection的UI不會更新與變化...

private void AddFeedClick(object sender, EventArgs e) 
{ 
    var task = FeedModel.Load("Reddit"); 
    var awaiter = task.GetAwaiter(); 

    awaiter.OnCompleted(() => 
    { 
     var model = awaiter.GetResult(); 
     FeedModel.Save(model); 
     ((ObservableCollection<FeedViewModel>)Resources["FeedsViewModel"]).Add(new FeedViewModel(model)); 
    }); 
} 

當新的視圖模型被添加到ObservableCollection並檢查收集表明,集合事件的CollectionChanged有把柄觸及斷點rs(爲空)。

我怎樣才能讓LongListSelector從ObservableCollection自身更新?

回答

1

我通過改變AddFeedClickFeedsViewModel劇組從(ObservableCollection<FeedViewModel>這是實際類型的項目解決了這個問題。雖然沒有發生無效演員,但在這裏工作時一定有一些模糊的面向對象功能。我懷疑這個集合中實際上有兩個影子事件,一個是ObservableCollection類型,另一個是擴展類型,但我不確定。

1
  1. 嘗試從代碼而不是靜態綁定(set List.ItemSource = collection)綁定集合作爲項目源。如果CollectionChanged爲null,則表示沒有收集更改的訂閱者。
  2. 您也可以嘗試同步添加項目。
+0

嘗試同步添加項目,沒有效果。嘗試從代碼設置項目源,沒有效果。在同一時間嘗試,沒有影響。 –

+0

需要查看您的類FeedsViewModel。你重寫它PropertyChanged事件?你不應該。 –

+0

FeedsViewModel發佈在問題的頂部。我不重寫PropertyChanged事件。 –