朋友您好我在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");
}
我不知道为什么会这样。我在这里错过了一些概念,请告诉我......对此有任何帮助或建议。
答案 0 :(得分:2)
您缺少来自SomeCollection
财产的财产更改事件 - 请参阅this了解如何实施该事件。
需要的原因是,在分配FillCollection
属性之前执行异步之前DataContext
方法的部分,而在Web请求完成之后执行另一半。因此,在您的不工作示例中,View
不知道整个集合已更改。
另一方面,考虑一下你在每个列表刷新时分配ObservableCollection
的新实例而丢失的内容(你想在某些时候刷新它?)。这个类的基础是提供UI方法来优化ItemsControl
中项目的刷新,通过了解添加/删除/移动的元素,如果你创建一个新的集合ListView
将被重新呈现,这可以是昂贵。我建议在FillCollection
调用之前将您的作业移到构造函数中以获得代码清晰度原因,并且很好地处理内容更改 - 这对您来说更有用,但如果视图很复杂则值得。