1

インターフェイスをObservableCollection実装するビューモデルのコレクションである がありINotifyPropertyChangedます...

public class FeedsViewModel : ObservableCollection<FeedViewModel>
{
}

(コードは含めていませんが、FeedViewModel非常に標準的INotifyPropertyChangedで、個別にテストするとバインドされます)。

のインスタンスをコントロール内で使用してFeedsViewModelItemsSourceますLongListSelector...

<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、コレクション イベントの にハンドラーがない (null である) ことがわかります。

ObservableCollection から LongListSelector を更新するにはどうすればよいですか?

4

2 に答える 2

1
  1. 静的バインディングではなく、コードからアイテム ソースとしてコレクションをバインドしてみてください (List.ItemSource=collection を設定します)。CollectionChanged が null の場合、コレクションの変更に対するサブスクライバーがないことを意味します。
  2. また、アイテムを同期的に追加しようとする場合もあります。
于 2013-01-22T09:50:38.767 に答える
1

キャストインAddFeedClickを実際のアイテムのタイプであるに変更することで、この問題を解決し(ObservableCollection<FeedViewModel>ました。FeedsViewModel無効なキャストは発生していませんが、ここで動作しているあいまいな OO 機能があったに違いありません。コレクションには実際には 2 つのシャドウ イベントがあり、1 つはObservableCollection型用、もう 1 つは拡張型用であると思われますが、確かなことはわかりません。

于 2013-01-22T12:09:01.070 に答える