2012-05-06 73 views
0

我正在嘗試創建一個小型應用程序,以便爲即將到來的歐洲足球錦標賽做出貢獻。根據來自不同組合框的值顯示組合框項目

爲此,我需要添加匹配的課程。

我想要的是有3個組合框,其中第一個是由它匹配的類型(Poule A,Poule B等)設置的。在設置了組合框之後,我希望接下來的兩個組合框只顯示那些使用這些蠟筆的球隊。

我相信這可以使用轉換器,但我似乎無法得到它的工作..或有更好的方法?

當前代碼:

<ComboBox ItemsSource="{Binding MatchTypes}" 
         DisplayMemberPath="TypeName" 
         Grid.Row="1" /> 

<ComboBox ItemsSource="{Binding Teams}" 
         DisplayMemberPath="TeamName" 
         Grid.Column="1" 
         Grid.Row="1" /> 

<ComboBox ItemsSource="{Binding Teams}" 
         DisplayMemberPath="TeamName" 
         Grid.Column="2" 
         Grid.Row="1" /> 

有一個簡單的方法(LINQ?)查詢最後兩個組合框的只有那些在第一組合框中選擇的POULE球隊?

如果可能的話,我寧願不要使用視圖模型,並使用轉換器或類似的東西。

回答

2

就個人而言,我會保留在viewmodel代碼中。我做了類似的事情,所以這裏被映射到你在做什麼:

  • 我在我的視圖模型項目的預填充的列表。這將是MatchTypes。

  • 我會有另一個名爲CurrentMatchType的屬性,當它被設置時使用INotifyPropertyChanged。

  • 當CurrentMatchType的值被設置時,它會調用數據源並填充viewmodel上的其他兩個列表。我們也有2個變量叫做PouleA和PouleB,代表最終的團隊選擇。我們將調用您剛剛從服務器TeamsA和TeamsB中獲取的列表。這兩個列表的數據都是相同的,但是我會將數據源結果設置爲內部值,然後將TeamsA設置爲除PouleB中選擇的所有組以外的所有組的列表,並將TeamsB列表設置爲除所有組外的列表那些在PouleA。這樣,一個團隊不能自己匹配。我忘了

  • 最後一兩件事:在PouleA和PouleB的二傳手,你可以運行相同的代碼如上篩選可用的團隊,以便對方球隊也排除在外。由於INPC符合所有要求,您的組合框將全部自動更改。

  • 當我從一個數據源獲取數據時,我公開了一個屬性讓一個BusyIndi​​cator接管屏幕,因此在抓取數據完成之前不會有任何東西可以觸及。

我在營地認爲嘗試使用轉換器這樣的事情會增加不必要的挫折感。如果你不想將它添加到你的視圖模型,因爲你在不同的地方重複使用它,沒有任何東西阻止你製作一個新的視圖模型,將舊的視圖模型公開爲屬性。

僞代碼

using System; 

/* In your model... */ 

public sealed class MatchType 
{ 
    public string Name { get; internal set; } 
    public string Description { get; internal set; } 
    public int ID { get; internal set; } 
} 

public sealed class Team 
{ 
    public string Name { get; set; } 
    public MatchType MatchType { get; set; } 
    public int? MatchTypeID { get; set; } 
    public int ID { get; set; } 
} 

/* In your viewmodel... */ 

public sealed class TeamSelection 
{ 

    // These two should be INotifyPropertyChanged, shortened for this example. 
    public MatchType[] MatchTypes { get; private set; } 
    public Team[] TeamsA { get; private set; } 
    public Team[] TeamsB { get; private set; } 

    private Team[] teams = null; 
    MatchType matchType = null; 
    public MatchType SelectedMatchType { 
     get { return matchType; } 
     set 
     { 
      if (value != null) 
       matchType = value; 
      else if (MatchTypes != null && MatchTypes.Length > 0) 
       matchType = MatchTypes[0]; 
      else 
       return; 
      PropertyHasChanged(() => SelectedMatchType); 
      PopulateTeams(); 
     } 
    } 

    Team teamA; 
    Team teamB; 

    public Team SelectedTeamA 
    { 
     get { return teamA; } 
     set 
     { 
      if (teamA.ID == teamB.ID) 
       // Alternatively, set a flag and stop execution. 
       throw new InvalidOperationException("The same team cannot be selected."); 
      teamA = value; 
      PopulateTeams(); 
      PropertyHasChanged(() => SelectedTeamA); 
     } 
    } 

    public Team SelectedTeamB 
    { 
     get { return teamB; } 
     set 
     { 
      if (teamA.ID == teamB.ID) 
       // Alternatively, set a flag and stop execution. 
       throw new InvalidOperationException("The same team cannot be selected."); 
      teamB = value; 
      PopulateTeams(); 
      PropertyHasChanged(() => SelectedTeamB); 
     } 
    } 

    /// <summary> 
    /// This can be done on your model, or what I do is pass it to 
    /// an intermediary class, then that sets the busy status to 
    /// a BusyIndicator set as the visual root of the application. 
    /// </summary> 
    public bool IsBusy { get; private set; } 
    public string IsBusyDoingWhat { get; private set; } 

    public TeamSelection() 
    { 
     // Call out to DB for the match types, setting busy status 
     var wcf = new WcfService(); 
     wcf.GetMatchTypes(response => 
     { 
      wcf.GetMatchTypesForTeam(MatchType, response2 => 
      { 
       teams = response.Value.ToArray(); 
       MatchTypes = response2.Value.ToArray(); 
       MatchType = MatchTypes[0]; 
       PopulateTeams(); 
      }); 
     }); 
    } 

    void PopulateTeams() 
    { 
     if (MatchType == null) 
      return; 
     var op = teams.Where(t => t.MatchTypeID == MatchType.ID); 
     if (SelectedTeamA != null) 
      TeamsB = op.Where(t => t.ID != SelectedTeamA.ID).OrderBy(t => t.Name); 
     else 
      TeamsB = op.OrderBy(t => t.Name); 
     if (SelectedTeamB != null) 
      TeamsA = op.Where(t => t.ID != SelectedTeamB.ID).OrderBy(t => t.Name); 
     else 
      TeamsA = op.OrderBy(t => t.Name); 
    } 

} 
+0

我完全同意,試圖在視圖模型進行數據處理。 – Nair

+0

感謝您的詳細解答。我相信我可以通過這個去解決問題。 –