0

由于我是 wpf 的新手,所以我在有关类似主题的网页中迷失了自己。我希望有人可以帮助我解释一些我无法理解的基本内容。

我有一个通过 websocket 连接到服务器的 wpf 应用程序。服务器每 5 秒向我返回一个列表。每个新列表都与旧列表无关。当我得到新列表时,旧列表不再重要。我对他的 ID 感兴趣的玩家(在列表中)的唯一属性。

不知何故,我需要刷新或更新列表框。我以这种方式使用了 observable 集合:

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 始终为空。我真的迷失了如何更新列表框。

列表框的 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>
4

1 回答 1

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");
    }
}
于 2012-06-11T10:08:47.003 回答