Remplissage et reliure de deux combobox WPF Caliburn.micro

binding caliburn.micro combobox dapper wpf

Question

J'ai cette table:

entrer la description de l'image ici

J'utilise dans mon projet cette vue appelée NewItem et dans cette vue il y a deux combobox.

entrer la description de l'image ici

Je voudrais faire ceci: que dans le groupe de liste déroulante il y a tout DESCRIPTION de la table GROUP, et quand je choisis un élément de cette description (de la première liste déroulante) la deuxième liste déroulante remplit des descriptions concernant seulement cette description .

Ceci est un code:

XAML NewItemView:

<ComboBox Height="21" HorizontalAlignment="Left" Margin="89,99,0,0" 
                  VerticalAlignment="Top" Width="106" x:Name="Group" SelectedItem="{Binding SelectedGroup}" />

Le code ViewModel est comme:

[Export(typeof(IScreen))]
public class NewItemViewModel : Screen
{
   public string SelectedGroup { get; set; }
   public String[] Group { get { return Groups; } }

   [..]


   //Constructor         
   public NewArticleViewModel()
   {
       Groups = GetGroups();
   }


   //Method
   private string[] GetGroups()
   {
     OleDbConnection conn = new OleDbConnection(StringConn);
     List<Group> groups = new List<Group>();

     conn.Open();
     groups = conn.Query<Group>(Q_SELECT_GROUPS,null,null).ToList();
     conn.Close();

     string[] array = new string[groups.Count];

     for (int i = 0; i < array.Length; i++)
     {
        array[i] = groups[i].Descripion;
     }

     return array;
   }
}

La classe de groupe est:

public class Group 
{
    public int Id { get; set; }
    public string Descripion { get; set; }
}

Je voulais préciser que j'utilise Caliburn.Micro et Dapper pour les accès.

Merci beaucoup !

Réponse acceptée

Il s’agit d’un scénario type maître / détail et il existe un moyen simple et typique de le résoudre.

I. Au lieu de charger uniquement des descriptions sous la forme d'une string[] dans votre méthode GetGroups , chargez l'objet Group enitre ou, s'il y a beaucoup de propriétés, créez un modèle de vue avec uniquement les deux propriétés nécessaires:

class GroupViewModel {
    public int GroupId {get; set;}
    public string Description {get; set;}
}

II. Dans NewItemViewModel ajoutez une propriété pour le deuxième ComboBox, disons

class NewItemViewModel {
    private ObservableCollection<SubgroupViewModel> _subgroups;
    public ObservableCollection<SubgroupViewModel> Subgroups
    {
        get {
            if (_subgroups == null)
                _subgroups = new ObservableCollection<SubgroupViewModel>();
            return _subgroups;
        }
        set {
            _subgroups = value;
            NotifyPropertyChanged("Subgroups");
        }
    }
}

III. Maintenant, dans votre NewItemViewModel , les propriétés deviennent quelque chose comme ceci:

class NewItemViewModel {
    public GroupViewModel SelectedGroup
    {
        set {
            var currentlySelected = value;
            // LOAD ALL RELATED Subgroup Descriptions FOR currentlySelected.GroupId;
            Subgroups = // LOADED Subgroup DESCRIPTIONS
        }
    }
    public ObservableCollection<GroupViewModel> Group { get { return Groups; } }
}

J'espère que vous en aurez l'idée, voici les grandes lignes de la méthode. Je pense que vous pouvez l'améliorer un peu en exploitant certaines propriétés importantes de Selectors et en utilisant d'autres techniques pour charger les données.



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi