UWP - 从正在运行的异步方法刷新ListView

时间:2017-04-18 09:51:00

标签: c# xaml listview uwp

我编写了一个方法,它发送UDP广播并在循环中收到结果,这些结果立即写入List<String>。由于我正在使用ReceiveAsync(),因此它正在运行异步。

我的问题是:每次循环向我的列表添加字符串时,如何在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代码

<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;
 }

1 个答案:

答案 0 :(得分:1)

首先,您应该使用数据绑定将数据绑定到ListView

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

现在你必须在代码隐藏中实际创建这样的属性:

ObservableCollection<string> IpList => ND2.ipList;

最后,将ipList的类型更改为ObservableCollection<string>。您不必再在ItemsSource方法中手动设置btnBroadcast_Click,因为它直接绑定到ND2.ipList。此外,由于它是ObservableCollection<string>,所以添加的任何新项目都会自动反映在用户界面中。

**注意:**确保您没有创建ipList的新实例,因为ListView将保持绑定到原始实例。我认为ipList是一个字段或属性:

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

现在,属性在开头初始化,不会更改。如有必要,您可以使用Clear()方法删除集合中的所有元素,而不是设置新实例。