2

こんにちは、Windows ストア アプリの非同期メソッドでObservableCollectionを使用すると、非常に奇妙な問題が発生します。非同期メソッドで ObservableCollection にアイテムを追加しようとしていますが、 await キーワードがある行の上に ObservableCollection を定義すると正常に動作しますが、この行の下で初期化すると機能しません。この問題のサンプルを作成しました。私のxamlコードは..

<Page
x:Class="observableCollectionTest.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:observableCollectionTest"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d">

<Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
    <ListView ItemsSource="{Binding SomeCollection}" Background="Pink" HorizontalAlignment="Left" Width="500" >
        <ListView.ItemTemplate>
            <DataTemplate>
                <Grid Width="200" Height="200" Background="Red" >
                    <Button Content="click me" Name="btn" ></Button>
                </Grid>
            </DataTemplate>
        </ListView.ItemTemplate>            
    </ListView>
</Grid>

私のメインページのバックハンド作業コードは..

public sealed partial class MainPage : Page
{
    public ObservableCollection<string> SomeCollection { get; set; }

    public MainPage()
    {
        this.InitializeComponent();


        FillCollection();
        this.DataContext = this;
    }

    public async Task FillCollection()
    {
        SomeCollection = new ObservableCollection<string>(); // it is working..
        HttpClient client = new HttpClient();
        HttpResponseMessage message = await client.GetAsync("https://www.google.co.in/");

        SomeCollection.Add("asd");
        SomeCollection.Add("asd");
        SomeCollection.Add("asd");
        SomeCollection.Add("asd");
        SomeCollection.Add("asd");
        SomeCollection.Add("asd");
        SomeCollection.Add("asd");
        SomeCollection.Add("asd");
        SomeCollection.Add("asd");
        SomeCollection.Add("asd");

    }

私のメインページのバックハンド FillCollection コードが機能していません..

 public async Task FillCollection()
    {

        HttpClient client = new HttpClient();
        HttpResponseMessage message = await client.GetAsync("https://www.google.co.in/");
        SomeCollection = new ObservableCollection<string>(); // this is not working
        SomeCollection.Add("asd");
        SomeCollection.Add("asd");
        SomeCollection.Add("asd");
        SomeCollection.Add("asd");
        SomeCollection.Add("asd");
        SomeCollection.Add("asd");
        SomeCollection.Add("asd");
        SomeCollection.Add("asd");
        SomeCollection.Add("asd");
        SomeCollection.Add("asd");

    }

なぜこれが起こっているのかわかりません。ここでいくつかの概念がありません.教えてください.どんな種類の助けや提案も大歓迎です..

4

1 に答える 1

2

あなたのSomeCollectionプロパティから発生するプロパティ変更イベントが欠けています -それを実装する方法については、これを参照してください。

これが必要な理由は、FillCollectionasync の前のメソッドの一部がプロパティを割り当てる前に実行されDataContext、残りの半分が Web リクエストの完了後に実行されるためです。したがって、動作しない例では、Viewコレクション全体が変更されたことを知りません。

一方で、ObservableCollectionリストを更新するたびに の新しいインスタンスを割り当てて失っているものを検討してください (ある時点で更新したいですか?)。このクラスの根底にあるのは、 コストがかかる可能性がItemsControlある新しいコレクション全体をクレートする場合に、どの要素が追加/削除/移動されたかを知ることで、 内のアイテムの更新を最適化する UI 方法を提供することです。ListViewコードを明確にするために、呼び出しの前に割り当てをコンストラクターに移動し、FillCollectionコンテンツの変更を適切に処理することをお勧めします-それはあなたにとってより多くの作業ですが、ビューが複雑な場合はそれだけの価値があります.

于 2013-09-30T05:44:28.727 に答える