【问题标题】:ListBox DataTemplate Binding With Two ListsListBox DataTemplate 绑定两个列表
【发布时间】:2010-11-13 11:00:35
【问题描述】:

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

第一件事是我的班级有我的两个字符串数组。很简单。请注意,字符串数组内容是为了简单起见。

    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 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}"/>

似乎也不起作用,因为它正在网格内寻找工作。

朝着正确的方向稍加推动会大有帮助。

谢谢!

【问题讨论】:

    标签: c# wpf data-binding binding


    【解决方案1】:

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

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

    但我不推荐上述步骤。您需要重构 ViewModel 逻辑。我猜 'Jobs' 可以是一个静态实例,以便您可以进行 x:Static 绑定

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

    【讨论】:

    • 不幸的是,我的项目中的工作列表不是静态的,这会很好。
    • 那就试试我的第一步,ELementName绑定到ListBox
    【解决方案2】:

    您可能需要修改对象结构才能像这样工作:

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

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

    【讨论】:

      【解决方案3】:

      我遇到了和你大致相同的问题,只是我在 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>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-29
        • 2011-04-21
        • 1970-01-01
        相关资源
        最近更新 更多