2012-05-06 2 views
0

Я пытаюсь создать небольшое приложение, в котором я могу сделать poul для предстоящего чемпионата Европы по футболу.Показать элементы списков в зависимости от значения из другого combobox

Для этого мне нужно добавить совпадения.

Я хочу, чтобы у вас было 3 комбобокса, где первый задан по типу соответствия (Poule A, Poule B и т. Д.). После того, как было установлено combobox, я хочу, чтобы следующие две команды со списком отображали команды, которые находятся в этих пулах.

Я считаю, что это можно сделать с помощью конвертеров, но я не могу заставить его работать. Или есть лучший подход?

текущий код:

<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. Я сделал что-то подобное, так вот оно, отображается на то, что вы делаете:

  • У меня есть предварительно заселена список элементов в моем ViewModel. Это будут MatchTypes.

  • У меня было бы другое свойство под названием CurrentMatchType, используя INotifyPropertyChanged, когда он установлен.

  • Когда установлено значение CurrentMatchType, оно будет вызывать источник данных и заполнять два других списка на модели viewmodel. У нас также есть 2 переменные, называемые PouleA и PouleB, представляющие окончательный выбор команды. Мы будем вызывать списки, которые вы только что захватили с сервера TeamsA и TeamsB. Это те же данные для обоих списков, но я бы установил результат источника данных на внутреннее значение, а затем установил TeamsA в список всех команд, кроме одного, выбранного в PouleB, а список TeamsB - в список всех команд, кроме те в PouleA. Таким образом, одна команда не может быть согласована сама по себе.

  • Одна последняя вещь, которую я забыл: На сеттер PouleA и PouleB, вы бы запустить тот же код, как описано выше, для фильтрации доступных команд, так что противоположная команда также исключается. Поскольку INPC подключен ко всему, ваши comboboxes будут автоматически меняться.

  • Когда я беру данные из источника данных, я выставляю свойство, чтобы BusyIndicator взял экран, поэтому ничто не может быть затронуто до тех пор, пока оно не будет захвачено данными.

Я в лагере, который думает, что пытается использовать конвертер для таких вещей, добавляет ненужное разочарование. Если вы не хотите добавлять его в свою модель просмотра, потому что вы повторно используете ее в разных местах, вам нечего мешать создавать новую модель представления, которая предоставляет старую модель представления как свойство.

псевдокод

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

Благодарим вас за подробный ответ. Я уверен, что смогу добиться этого. –

Смежные вопросы