2017-04-18 28 views
0

我已經寫了一個方法,它發送一個UDP廣播並接收一個循環中的結果,並立即寫入List<String>。由於我使用ReceiveAsync(),它正在運行異步。UWP - 從正在運行的異步方法刷新ListView

我的問題是:如何在每次循環向我的列表添加字符串時在我的UI中刷新ListView。所以我希望結果能夠在列表中顯示在屏幕上。

代碼

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控件代碼隱藏XAML

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

代碼

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; 

最後,ipList的類型更改爲ObservableCollection<string>。您不必再在btnBroadcast_Click方法中手動設置ItemsSource,因爲它直接綁定到ND2.ipList。此外,由於它是ObservableCollection<string>,所添加的任何新項目都將自動反映在用戶界面中。

**注意:**請確保您沒有創建ipList的新實例,因爲ListView將保持綁定到原始實例。我相信ipList是一個字段或屬性:

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

現在該物業在開始時初始化,並不會改變。如果需要,可以使用Clear()方法刪除集合中的所有元素,而不是設置新實例。

+0

我試過這個,就是你如何解釋這個。但是現在我在ipList.Add(...)處得到一個異常;它是:一個接口,被其他線程編組,被應用程序調用。 – David

+0

我現在確實修好了,它完全可以工作!我只需要將ipList.Add(..)更改爲: await CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal,()=> {ipList.Add(message);}); – David

+0

偉大的:-)。在UI線程上使用'ObservableCollection'很重要,否則你會得到這個異常:-)。快樂的編碼! –