2017-04-18 19 views
0

UDPブロードキャストを送信し、その結果をループで受信して即座にList<String>に書き込むメソッドを作成しました。私はReceiveAsync()を使っているので、それは非同期で実行されています。UWP - 実行中の非同期メソッドからListViewをリフレッシュする

私の質問は:どのように私のUIでリストビューをリフレッシュすることができますループは、私のリストに文字列を追加するたびに。だから私は結果がリストに表示されるように画面上に即座に表示されるようにしたい。

コード

do 
{ 
    UdpReceiveResult result = await sclient.ReceiveAsync(); 
    ipList.Add(result.RemoteEndPoint.Address.ToString()); 
    // after this step I want the ListView to get refreshed 
} while (sclient.Available != 0); 

XAML ListViewのコード

<ListView x:Name="lbIps" HorizontalAlignment="Left" Height="174" 
Margin="450,151,0,0" VerticalAlignment="Top" Width="298" /> 

XAML

の背後にあるコード
public async void btnBroadcast_Click(object sender, RoutedEventArgs e) 
{ 
    await ND2.run(); 
    lbIps1.ItemsSource = ND2.ipList; 
} 
+0

どのようにListViewを表示していますか?あなたのUIをipListにバインドする場合は、リストが更新されるたびに 'OnPropertyChanged(" ipList ")'を呼び出すだけでよいでしょう。 – Lithium

+0

私のMainApp.xaml.csでは、私の非同期UDPメソッドを実行します。それが完了/キャンセルされた後は、lvIp.ItemsSource = UDPMethodClass.IpList;を使用します。それで、私の仕事のキャンセル後の結果を表示します。 – David

+0

そのコードも投稿して、リストを表示するXAMLを投稿する必要があります。実際には、ipListが読み込まれるときにこれを更新したい場合は、XAML内のitemsSourceをバインドし、更新が必要なときには 'OnPropertyChanged()'を呼び出す必要があります。 – Lithium

答えて

1

あなたはデータバインディングを使用してListViewにデータをビンビンすべきまず第一に:

<ListView x:Name="lbIps" ItemsSource="{x:Bind IpList}" ... /> 

今、あなたは実際にコードビハインドで、このようなプロパティを作成する必要があります。

ObservableCollection<string> IpList => ND2.ipList; 

最後に、ObservableCollection<string>ipListの種類を変更します。 btnBroadcast_Clickメソッドの内部に手動でItemsSourceを設定する必要がなくなりました。ND2.ipListに直接バインドされています。また、それがObservableCollection<string>であるという事実のおかげで、追加された新しいアイテムは自動的にUIに反映されます。

**注:**は元のインスタンスにバインドされているため、ipListの新しいインスタンスを作成しないでください。

public ObservableCollection<string> ipLIst {get;} = new ObservableCollection<string>(); 

今すぐプロパティが最初に初期化され、変更されません:私はipListがフィールドまたはプロパティであると推定します。 Clear()メソッドを使用すると、必要に応じて新しいインスタンスを設定する代わりに、コレクション内のすべての要素を削除できます。

+0

私はこれを試しました、あなたがこれを説明した方法です。しかし、今はipList.Add(...)で例外が発生します。それは、他のスレッドのためにマーシャリングされたインターフェイスで、アプリケーションによって呼び出されました。 – David

+0

私は実際にそれを修正しました、それは完全に動作します!私はipList.Add(..)を次のように変更しなければなりませんでした: CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal、()=> {ipList.Add(message);}); – David

+0

素晴らしい:-)。UIスレッドでObservableCollectionを使用することが重要です。そうしないと、この例外が発生します:-)。ハッピーコーディング! –

関連する問題