2009-07-23 55 views
0

我将一个列表框绑定到一个包含两个字符串数组的对象。每个列表框项目都设置为由文本框和组合框组成的数据模板。第一个字符串数组绑定到列表,第二个字符串数组绑定到组合框。那么,至少这是我想要实现的。问题是我找不到绑定语法来将第二个数组设置为组合框。这里是我有什么:ListBox DataTemplate与两个列表绑定

第一件事是我的类与我的两个字符串数组。非常简单。请注意,字符串数组的内容就是为了简单起见。

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; } } 
    }; 

在代码中,我把这个类的一个实例,因为这ListBox的DataContext的:

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

与数据模板,看起来像这样:

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

我通常走出我的实验是人的列表框,但每个列表项的组合框是空的。

我能得到它的工作,如果我使用

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

,但我不希望使用的ElementName,因为它的硬编码阵列的源特定的列表框,我想避免。

试图像

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

似乎不工作,要么因为它是寻找网格内作业。

向正确的方向稍微推动会有很大的帮助。

谢谢!

回答

0

当您在DataTemplate上代表一个人时,您的JobAssignments实例不存在。尝试以下

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

但我不建议上述步骤。你需要重构你的ViewModel逻辑。我猜“乔布斯”可以是静态实例,这样就可以做斧:静态绑定

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

不幸的是,我的项目中的作业列表并不是静态的,这本来不错。 – djcouchycouch 2009-07-23 16:41:31

0

你可能需要修改你的对象结构是这样的工作:

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; } } 
} 

然后,您可以删除问号,事情应该工作。

1

我和你有大致相同的问题,除了我在tabcontrol中有一个列表框。我能够通过使用包含列表框的选项卡控件来解决它。示例代码如下:

<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> 
相关问题