异步方法中的可观察集合
本文关键字:观察 集合 异步方法 | 更新日期: 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
并很好地处理内容更改 - 这对您来说需要更多的工作,但如果视图很复杂,这是值得的。