2010-01-03 8 views
1

Question: Comment définir la liaison pour les éléments sélectionnés d'une zone de liste déroulante sur une propriété et la liste d'éléments sur une propriété différente?Liaison d'une liste d'éléments et d'éléments sélectionnés d'une liste déroulante à des propriétés différentes dans wpf


Info:

J'ai un programme d'inventaire je travaille pour mon entreprise qui est principalement destinée aux personnes qui reçoivent des expéditions comme ils viennent, j'ai des choses mises en place pour qu'il y ait. une liste des envois d'un côté de l'écran. quand ils en sélectionnent un, toutes les informations sur l'envoi sont affichées pour pouvoir être éditées. un élément d'information est la personne qui a reçu l'envoi. Je le veux pour que quand ils cliquent sur l'expédition, évidemment l'utilisateur qui a reçu l'expédition est celui qui apparaît dans la zone de liste déroulante. mais je veux que la liste déroulante contienne la liste de tous les autres utilisateurs.

Cela ne serait pas trop dur si je n'avais pas tiré la liste des utilisateurs d'une base de données. la zone de liste contient un modèle de données permettant d'extraire les informations appropriées de la liste des types de données utilisateur. ce que j'ai essayé jusqu'ici est d'avoir une vue de collection dans le viewmodel auquel la zone de liste déroulante se lie pour sa liste, puis une propriété séparée qui est une instance d'utilisateur unique qui vient avec le type de données d'expédition.

Je programme en Visual Basic et XAML selon le modèle de programmation M-V-VM.

Répondre

1

Votre approche ne pose aucun problème. Le ViewModel peut exposer une collection de types de la db et une propriété séparée lié à l'élément sélectionné, quelque chose comme:

public ObservableCollection<Shipment> AllShipments { get; private set; } 
public Shipment SelectedShipment { get; set; } 

// Constructor 
public MyViewModel() 
{ 
    AllShipments = ReadFromDb(); 
} 

En termes de combobox étant vide

  • Jetez un oeil à la sortie fenêtre dans VS lorsque vous démarrez votre application - existe-t-il une ligne qui se plaint d'un échec de liaison?
  • Double-vérifier l'orthographe de vos propriétés par rapport à votre liaison xaml
  • Placez un point d'arrêt sur le getter AllShipments pour vous assurer qu'il n'est pas null lorsque la vue instancie la liaison. Si vous lisez la base de données dans le constructeur de la machine virtuelle (comme ci-dessus) alors ce sera OK.

aussi - si vous voulez que la zone de liste déroulante pour afficher l'utilisateur de l'objet d'expédition, rappelez-vous alors pour assurer votre VM (ou sa base) met en œuvre INotifyPropertyChanged et déclenche un événement PropertyChanged dans le poseur SelectedShipment - cela propager le changement jusqu'à la vue via le DataBinding ...

espérons que cette aide :)

+0

se révèle la raison pour laquelle il n'a pas été peuplait Étais-je manqué un .ToList après ma déclaration LINQ. Donc ça marche bien et dandy maintenant. Mais je ne parviens toujours pas à lier correctement l'utilisateur de mon envoi. J'ai implémenté INotify, mais cela ne fonctionne toujours pas. D'autres suggestions? – Narcolapser

+0

J'ai écrit une courte série de blogs sur la façon de créer un contrôle * real simple * master-detail à http://ianrandallonwpf.wordpress.com. Il utilise un ListBox, mais vous pouvez facilement l'échanger avec un ComboBox ... HTH :) – kiwipom

+0

Je le fais déjà. Mon code est configuré de telle sorte que j'ai une zone de liste sur le côté gauche de l'écran. Vous sélectionnez Expédition, puis un présentateur de contenu sur le côté droit affiche les données connexes. À l'intérieur de ce présentateur de contenu est mon problème quelques combobox. Le problème semble résider dans le fait que c'est le détail et non le maître. La zone de liste déroulante est liée à une liste d'utilisateurs comme je le souhaite, mais je veux que l'utilisateur sélectionné soit celui que le programme charge à partir de la base de données. – Narcolapser

0

Je vais répondre à cette question en supposant que vous utilisez LINQ to SQL:

C'est un problème commun PITA, où leLa propriétéde votre objet Shipment contient une référence à un objet User différent de l'objet User de la requête qui a rempli le ComboBox, même s'ils représentent le même enregistrement.

Pour résoudre ce problème, vous pouvez associer les utilisateurs ComboBox à une liste d'utilisateurs récupérée à partir du même DataContext que la liste Shipments.

Exemple:

class ViewModel 
{ 
    public List<User> Users { get; set; } 
    public List<Shipment> Shipments { get; set; } 
    public Shipment SelectedShipment { get; set; } 

    public void ReadShipments() 
    { 
     using (var dc = new MyDataContext()) 
     { 
      DataLoadOptions dlo = new DataLoadOptions(); 
      dlo.LoadWith<Shipment>(x => x.User); 
      dc.LoadOptions = dlo; 
      Shipments = dc.Shipments.ToList(); 
      Users = dc.Users.ToList(); 
     } 
    } 
} 
+0

Eh bien, s'avère que la boîte ne peuplait pas était une erreur id10t. J'ai oublié .ToList à la fin de ma déclaration LINQ ... \ n de toute façon, la zone de liste remplit, mais je ne peux toujours pas définir l'utilisateur sélectionné à celui de l'envoi. J'ai essayé d'utiliser mon traducteur de code sur le C# que vous m'avez donné, et cela n'avait aucun sens dans VB. J'ai le contexte de données estompé au début de la classe, donc c'est le même contexte utilisé pour les deux. Mais je ne vois pas comment cela fait une différence. \ n bonne estimation sur moi en utilisant LINQ. – Narcolapser

+0

Êtes-vous peupler le combo avec le même datacontext que vous interrogez vos envois? –

+0

En y regardant de plus près, non. Je charge les utilisateurs depuis l'intérieur de l'envoiVM. C'est la méthode que j'ai utilisée pour les palettes sur l'expédition, ça a bien fonctionné, donc je recyclais. devrais-je charger les utilisateurs et leur transmettre une référence par AllShipmentsVM? – Narcolapser