2009-07-23 7 views
0

Je lie une liste à un objet contenant deux tableaux de chaînes. Chaque élément de zone de liste est défini sur un modèle de données composé d'une zone de texte et d'une zone de liste déroulante. Le premier tableau de chaînes est lié à la liste et le second tableau de chaînes est lié à la liste déroulante. Eh bien, au moins c'est ce que j'essaie d'accomplir. Le problème est que je ne peux pas comprendre la syntaxe de liaison pour définir le deuxième tableau dans la zone de liste déroulante. Voici ce que j'ai:Liaison ListBox DataTemplate avec deux listes

La première chose est ma classe avec mes deux tableaux à cordes. Assez simple. S'il vous plaît noter que le contenu de la chaîne de caractères est là pour plus de simplicité.

public class JobAssignments 
    { 
     public JobAssignments() 
     { 
      m_people.Add("John"); 
      m_people.Add("Bill"); 
      m_people.Add("Frank"); 
      m_people.Add("Steve"); 

      m_jobs.Add("Architect"); 
      m_jobs.Add("Teacher"); 
      m_jobs.Add("Carpenter"); 
      m_jobs.Add("Plumber"); 

     } 

     private List<string> m_people = new List<string>(); 
     public List<string> People { get { return m_people; } set { m_people = value; } } 

     private List<string> m_jobs = new List<string>(); 
     public List<string> Jobs { get { return m_jobs; } set { m_jobs = value; } } 
    }; 

Dans le code, je mis une instance de cette classe comme datacontext de cette zone de liste:

<ListBox x:Name="listBox" 
      Grid.Row="0" 
      HorizontalContentAlignment="Stretch" 
      DataContext="{Binding}" 
      ItemsSource="{Binding People}" 
      ItemTemplate="{StaticResource JobAssignmentDataTemplate}"> 
    </ListBox> 

Avec un modèle de données qui ressemble à ceci:

<DataTemplate x:Key="JobAssignmentDataTemplate"> 
      <Grid> 
       <Grid.ColumnDefinitions> 
        <ColumnDefinition/> 
        <ColumnDefinition/> 
       </Grid.ColumnDefinitions> 
       <TextBlock Grid.Column="0" 
          Text="{Binding}"/> 
       <ComboBox Grid.Column="2" 
          SelectedIndex="0" 
          ItemsSource="{Binding Jobs ???? }"/> 
      </Grid> 
     </DataTemplate> 

Ce que je habituellement sortir mes expériences est une liste de personnes, mais la liste déroulante de chaque élément de la liste est vide.

je peux l'obtenir pour travailler si j'utilise

ItemsSource="{Binding ElementName=listBox, Path=DataContext.Jobs }"/> 

mais je ne veux pas utiliser ElementName comme la source de hardcodes le tableau d'une zone de liste spécifique que je voudrais éviter.

Essayer quelque chose comme

ItemsSource="{Binding RelativeSource={RelativeSource Self}, Path=Parent.Jobs}"/> 

ne semble pas fonctionner non plus comme il est à la recherche pour les emplois dans la grille.

Une petite poussée dans la bonne direction aiderait grandement.

Merci!

Répondre

0

Lorsque vous êtes sur DataTemplate et que vous représentez seulement un People, votre instance JobAssignments n'est pas présente. Essayez le ci-dessous

ItemsSource="{Binding ElementName= listBox, Path=Jobs}"/> 

Mais je ne recommande pas l'étape ci-dessus. Vous devez refactoriser votre logique ViewModel. Je suppose que « l'emploi » peut être une instance statique de sorte que vous pouvez faire la hache: Liaison statique

ItemsSource="{Binding Source={x:Static JobAssignments}, Path=Jobs}" 
+0

Malheureusement, la liste des tâches n'est pas statique dans mon projet, ce qui aurait été bien. – djcouchycouch

+0

Ensuite, essayez ma première étape, la liaison ELementName à la ListBox –

0

Vous avez probablement besoin de modifier la structure de votre objet à travailler comme ceci:

public class Person 
{ 
    public string Name; 
    public IEnumerable<string> Jobs; 
} 

public class JobAssignments 
{ 
    public JobAssignments() 
    { 
    Jobs.Add("Architect"); 
    ... 

    People.Add(new Person() { Name = "Bob", Jobs = Jobs }); 
    ... 
    } 

    private List<Person> m_people = new List<Person>(); 
    public List<Person> People { get { return m_people; } } 

    private List<string> m_jobs = new List<string>(); 
    public List<string> Jobs { get { return m_jobs; } } 
} 

Ensuite, vous pouvez enlever les points d'interrogation, et les choses devraient fonctionner.

1

J'avais à peu près le même problème que vous, sauf que j'avais une zone de liste dans un onglet. J'ai été capable de le résoudre en utilisant le contrôle onglet qui contenait la liste. Exemple de code comme suit:

<TabControl ItemsSource="{Binding Groups, Mode=TwoWay}" SelectedItem="{Binding SelectedGroup, Mode=TwoWay}"> 
    <TabControl.ContentTemplate> 
     <DataTemplate> 
      <ListBox ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=TabControl, AncestorLevel=1}, Path=DataContext.ItemsInGroup, Mode=TwoWay}"> 
       <ListBox.ItemTemplate> 
        <DataTemplate> 
         <TextBlock Text="{Binding ItemGroup}" /> 
        </DataTemplate> 
       </ListBox.ItemTemplate> 
      </ListBox> 
     </DataTemplate> 
    </TabControl.ContentTemplate> 
</TabControl> 
Questions connexes