2013-09-30 4 views
2

안녕하세요 친구 ObservableCollection내 비동기 메서드를 사용하여 매우 이상한 문제가 발생했습니다. 내 Windows 앱에 저장됩니다. 나는 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> 

내 mainpage 백핸드 작업 코드는 .. 작동하지 않습니다 내 mainpage의 백핸드 FillCollection 코드

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"); 

    } 

..

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에 항목 새로 고침을 최적화하는 UI 방법을 제공하는 것입니다. 새 컬렉션을 작성하면 추가/제거/이동되는 요소를 알 수 있으므로 ListView 전체가 다시 렌더링되어 값 비쌉니다. FillCollection 코드 명확성을 요구하고 콘텐트가 잘 처리되도록하기 전에 생성자로 과제를 옮기는 것이 좋습니다. 더 많은 작업이 필요하지만보기가 복잡하면 가치가 있습니다.

관련 문제