我编写了一个方法,它发送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;
}
答案 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()
方法删除集合中的所有元素,而不是设置新实例。