由于我是wpf的新手,我在关于类似主题的网页上失去了自己。我希望有人可以帮我解释一些我无法理解的基本内容。
我有一个wpf应用程序通过websocket连接到服务器。服务器每隔5秒返回一个List。每个新列表都与旧列表无关。当我得到新列表时,旧列表不再重要。玩家(在列表中)中唯一感兴趣的是他的身份证。
不知何故,我需要刷新或更新列表框。我用这种方式使用了可观察的集合:
private static ObservableCollection<Player> sample;
private static List<Player> sample2 = new List<Player>();
public List<Player> update
{
set
{
sample2 = value;
sample = new ObservableCollection<Player>((List<Player>) sample2);
onPropertyChanged(sample, "ID");
}
}
private void onPropertyChanged(object sender, string propertyName)
{
if (this.PropertyChanged != null)
PropertyChanged(sender, new PropertyChangedEventArgs(propertyName));
}
调试时,propertychanged始终为null。我真的迷失了如何更新列表框。
列表框的xaml如下所示:
<DataTemplate x:Key="PlayerTemplate">
<WrapPanel>
<Grid >
<Grid.ColumnDefinitions x:Uid="5">
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="50"/>
</Grid.RowDefinitions>
<TextBlock VerticalAlignment="Center" Margin="5" Grid.Column="0" Text="{Binding Path=ID}" FontSize="22" FontWeight="Bold"/>
</Grid>
</WrapPanel>
答案 0 :(得分:1)
sample
没有名为"ID"
的属性,因为sample
是您的集合,而不是您的Player
实例。此外,由于您正在完全替换该集合,因此使用可观察的集合是没有意义的。试试这个:
private ICollection<Player> players = new List<Player>();
public ICollection<Player> Players
{
get { return this.players; }
private set
{
this.players = value;
// the collection instance itself has changed (along with the players in it), so we just need to invalidate this property
this.OnPropertyChanged(this, "Players");
}
}