2013-09-30 7 views
2

Приветствую вас, я получаю очень странную проблему, используя ObservableCollection в async метод в моем приложении для Windows. Я пытаюсь добавить элементы в ObservableCollection в async-методе, он работает нормально, если я определяю 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"); 

    } 

Я не понимаю, почему это происходит. Я пропустил какую-то концепцию здесь, пожалуйста, скажите мне, что мне нравится какая-то помощь или предложение.

ответ

2

Вам не хватает события, связанного с изменением недвижимости, с вашего SomeCollection - см. this о том, как его реализовать.

Причина, по которой это необходимо, заключается в том, что часть вашего метода FillCollection перед асинхронным выполнением выполняется до назначения свойства DataContext, а другая половина после завершения веб-запроса. Поэтому в вашем неработающем примере View не знает, что вся коллекция была изменена.

С другой стороны, рассмотрите, что вы теряете, назначая новый экземпляр ObservableCollection в каждом обновлении списка (вы хотите его обновить в какой-то момент?). Основой этого класса является предоставление возможности пользовательского интерфейса оптимизировать обновление элементов в ItemsControl, зная, какие элементы, которые добавлены/удалены/перемещены, если вы введете новую коллекцию в целом, ListView будет перерегистрирован, что может быть дорогостоящим. Я предлагаю переместить ваше назначение в конструктор до того, как FillCollection вызовет причины ясности кода и отлично справится с содержанием контента - это больше для вас работа, но если просмотр сложный, это того стоит.

Смежные вопросы