2017-04-18 25 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'很重要,否则你会得到这个异常:-)。快乐的编码! –