2017-04-07 63 views
4

我正在創建一個籃球WPF應用程序,它顯示一個HomeTeam和一個AwayTeam。 我已經創建了一個Player對象,並在主窗口中爲家(HomePlayersList)和客隊(AwayPlayersList)創建了ObservableCollection球員對象。我已經在玩家對象上使用了INotifyPropertyChanged接口,所以當IsInGame布爾值爲真時,玩家將被添加到兩個ObservableCollection<Player>之一,具體取決於計數。 (如果列表中的一個ObservableCollection<Player> HomeTeamObservableCollection<Player> AwayTeam數爲5,那麼剩下的被添加到替代列表ObservableCollection<Team> HomeSubObservableCollection<Team> AwaySub。)如何區分對象類型c#

但我試圖區分玩家是否是在家裏還是客隊,並根據其玩家進入的列表中,玩家將被添加到主頁或者離開的新列表中。

public static ObservableCollection<Player> HomePlayersList; 
public static ObservableCollection<Player> AwayPlayersList; 
public static ObservableCollection<Player> HomeTeam = new ObservableCollection<Player>(); 
public static ObservableCollection<Player> AwayTeam = new ObservableCollection<Player>(); 
public static ObservableCollection<Player> HomeSub = new ObservableCollection<Player>(); 
public static ObservableCollection<Player> AwaySub = new ObservableCollection<Player>(); 
public static int HomeSubCount = 7; 

public class Player: INotifyPropertyChanged 
{ 
    public static bool IsHome = true; 
    private static int TotalSelected = 1; 
    public string Id { get; set; }   //player ID 
    public string FirstName { get; set; } //player first name 
    public string SecondName { get; set; } //player second name 
    public string KnownName { get; set; }  //player known name 
    public string Position { get; set; }  //player position 
    public string Number { get; set; }  //player number 

    public bool isInGame; 

    public bool IsInGame 
    { 
     get { return isInGame; } 

     set 
     { 
      if (value != isInGame) 
      { 
       isInGame = value; 

       if (isInGame) 
       { 
        OnPropertyChanged("IsInGame", true); 
       } 
       else 
       { 
        OnPropertyChanged("IsInGame", false); 
       } 
      } 
     } 
    } 

    protected void OnPropertyChanged(PropertyChangedEventArgs e) 
    { 
     PropertyChangedEventHandler handler = PropertyChanged; 
     if (handler != null) 
      handler(this, e); 
    } 

    protected void OnPropertyChanged(string propertyName, bool state) 
    { 
     OnPropertyChanged(new PropertyChangedEventArgs(propertyName)); 

     if (state) 
     { 
      if (TotalSelected > 5 + MainWindow.HomeSubCount) 
      { 
       this.IsInGame = false; 
       return; 
      } 

      if (MainWindow.HomeTeam.Count < 5) 
       MainWindow.HomeTeam.Add(this); 
      else 
      { 
       if (MainWindow.HomeSub.Count < MainWindow.HomeSubCount) 
       { 
        MainWindow.HomeSub.Add(this); 
       } 
      } 
      TotalSelected++; 
     } 
     else 
     { 

      if (SearchForMe(MainWindow.HomeTeam) != null) 
      { 
       MainWindow.HomeTeam.Remove(SearchForMe(MainWindow.HomeTeam)); 
       TotalSelected--; 
       return; 
      } 

      if (SearchForMe(MainWindow.HomeSub) != null) 
      { 
       MainWindow.HomeSub.Remove(SearchForMe(MainWindow.HomeSub)); 
       TotalSelected--; 
       return; 
      } 
     } 
    } 

    private Team SearchForMe(ObservableCollection<Team> OCT) 
    { 
     return OCT.Where(i => i.Number == this.Number).SingleOrDefault(); 
    } 

    public event PropertyChangedEventHandler PropertyChanged;`enter code here` 
} 

回答

2

粘貼在Player類的屬性

ObservableCollection<Player> CurrnetIn { get; set; } 

,並設置該屬性,如果你加入玩家在一些收藏。或者我誤解了這個問題。

+0

這是通過引用傳遞的嗎? – Decoder94

+1

是的,ObservableCollection <>是一個引用類型。所以你可以隨時參考玩家進入的容器/收藏。 – Rekshino

+0

如何從CurrentIn訪問列表的原始名稱或知道它是主頁還是離開?爲了添加到新的主頁或離開可觀察列表? – Decoder94

2

您可以使用ObservableCollection<T>類的Contains方法來確定特定對象是否已經在集合中:

if (MainWindow.HomeTeam.Contains(this)) 
{ 
    MainWindow.HomeTeam.Remove(this); 
    TotalSelected--; 
    return; 
} 

由於您Player類沒有實現IEquatable<T>界面,你傳遞給引用該Contains方法會相比,集合中的項目是在這種情況下完全正常:

Does List<String>.Contains(mystring) do a reference comparison or a value comparison?