异步方法中的可观察集合

本文关键字:观察 集合 异步方法 | 更新日期: 2023-09-27 18:33:20

你好朋友们,我在我的Windows应用商店应用程序中以异步方法使用ObservableCollection遇到了非常奇怪的问题。我正在尝试以异步方法在可观察集合中添加项目,如果我在 await 关键字所在的行上方定义可观察集合,它工作正常,但我在此行下方初始化它不起作用。我已经为这个问题做了样本。我的 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");
    }

我不明白为什么会这样。 我在这里缺少一些概念,请告诉我..感谢任何形式的帮助或建议。

异步方法中的可观察集合

您缺少从SomeCollection属性触发的属性更改事件 - 请参阅此处了解如何实现它。

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

另一方面,考虑在每次列表刷新时分配新的ObservableCollection实例(您想在某个时候刷新它?此类的基础是提供 UI 方法来优化 ItemsControl 中项目的刷新,方法是知道在中添加/删除/移动哪些元素,如果您将整个ListView的新集合重新渲染,这可能会很昂贵。我建议在调用代码清晰度之前将您的作业移动到构造函数FillCollection并很好地处理内容更改 - 这对您来说需要更多的工作,但如果视图很复杂,这是值得的。