异步方法中的可观察集合

时间:2013-09-30 05:25:35

标签: c# .net asynchronous windows-8 async-await

朋友您好我在Windows应用商店中的 async 方法中使用 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");

    }

我不知道为什么会这样。我在这里错过了一些概念,请告诉我......对此有任何帮助或建议。

1 个答案:

答案 0 :(得分:2)

您缺少来自SomeCollection财产的财产更改事件 - 请参阅this了解如何实施该事件。

需要的原因是,在分配FillCollection属性之前执行异步之前DataContext方法的部分,而在Web请求完成之后执行另一半。因此,在您的不工作示例中,View不知道整个集合已更改。

另一方面,考虑一下你在每个列表刷新时分配ObservableCollection的新实例而丢失的内容(你想在某些时候刷新它?)。这个类的基础是提供UI方法来优化ItemsControl中项目的刷新,通过了解添加/删除/移动的元素,如果你创建一个新的集合ListView将被重新呈现,这可以是昂贵。我建议在FillCollection调用之前将您的作业移到构造函数中以获得代码清晰度原因,并且很好地处理内容更改 - 这对您来说更有用,但如果视图很复杂则值得。