2012-05-06 13 views
0

今後のEuropianサッカー選手権でポールを作ることができる小さなアプリケーションを作成しようとしています。別のコンボボックスからの値に応じてコンボボックスの項目を表示します

これのために、私はofcourseのマッチを追加する必要があります。

私が願っているのは、3つのコンボボックスを持つことです。最初のコンボボックスは、どのような種類のマッチ(Poule A、Poule Bなど)によって設定されます。そのコンボボックスが設定された後、私は次の2つのコンボボックスだけがそれらのパウルにあるチームを表示したい。

私はこれがコンバータを使用して行うことができると信じていますが、私はそれを動作させるように見えません。

現在のコード:

<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" /> 

最初のコンボボックスで選択したPouleの中にある唯一のチームのための最後の二つのコンボボックスを照会する簡単な方法は、(?LINQ)はありますか?

可能であれば、私はこれをviewmodelから取り除き、コンバータなどを使用することをお勧めします。

答えて

2

個人的には、これをビューモデルコードに入れておきます。私はそれは、あなたが何をしているかにマッピングされているので、ここで、似たような行っている:

  • は私のviewmodelの項目の事前にリストを持っています。これはMatchTypesになります。

  • 私は、CurrentMatchTypeと呼ばれる別のプロパティを、INotifyPropertyChangedを設定して使用します。

  • CurrentMatchTypeの値が設定されると、データソースに呼び出され、他の2つのリストがviewmodelに移入されます。また、最終的なチーム選択を表すPouleAとPouleBという2つの変数もあります。サーバーTeamsAとTeamsBから取得したリストを呼び出します。両方のリストのデータは同じですが、データソースの結果を内部値に設定し、TeamsAをPouleBで選択されたチーム以外のすべてのチームのリストに設定し、TeamsBのリストを他のすべてのチームのリストに設定しますPouleAのもの。このようにして、1つのチームはそれ自身でマッチすることはできません。私は忘れてしまった

  • 最後の一つです:を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

詳細な回答ありがとうございます。私はこれと一緒に行くことができると確信しています。 –

関連する問題