我将列表框数据绑定到包含两个字符串数组的对象。每个列表框项都设置为由文本框和组合框组成的数据模板。第一个字符串数组绑定到列表,第二个字符串数组绑定到组合框。好吧,至少那是我想要实现的目标。问题是我无法弄清楚将第二个数组设置为组合框的绑定语法。这就是我所拥有的:
第一件事是我的两个字符串数组。非常直截了当。请注意,字符串数组内容是为了简单起见。
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}"/>
似乎无法工作,因为它正在网格中寻找工作。
向正确的方向稍微推动将有很大帮助。
谢谢!
答案 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; } }
}
然后,您可以删除问号,事情应该有效。