ListBox DataTemplate绑定两个列表

时间:2009-07-23 16:14:10

标签: c# wpf data-binding binding

我将列表框数据绑定到包含两个字符串数组的对象。每个列表框项都设置为由文本框和组合框组成的数据模板。第一个字符串数组绑定到列表,第二个字符串数组绑定到组合框。好吧,至少那是我想要实现的目标。问题是我无法弄清楚将第二个数组设置为组合框的绑定语法。这就是我所拥有的:

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

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

在代码中,我将此类的实例设置为此列表框的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>

我通常从实验中得到的是一个People列表框,但每个列表项的组合框都是空的。

如果我使用

,我可以让它工作
ItemsSource="{Binding ElementName=listBox, Path=DataContext.Jobs }"/>

但我不想使用ElementName,因为它将数组源代码硬编码为我想避免的特定列表框。

尝试类似

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

似乎无法工作,因为它正在网格中寻找工作。

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

谢谢!

3 个答案:

答案 0 :(得分: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>

答案 1 :(得分:0)

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

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

但我不推荐上述步骤。您需要重构ViewModel逻辑。我猜'乔布斯'可以是一个静态实例,这样你就可以做一个x:静态绑定

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

答案 2 :(得分: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; } }
}

然后,您可以删除问号,事情应该有效。