[英]ListBox DataTemplate Binding With Two Lists
我將一個列表框數據綁定到一個包含兩個字符串數組的對象。 每個列表框項目均設置為由文本框和組合框組成的數據模板。 第一個字符串數組綁定到列表,第二個字符串數組綁定到組合框。 好吧,至少那是我正在努力實現的目標。 問題是我無法弄清楚將第二個數組設置為組合框的綁定語法。 這是我所擁有的:
第一件事是我的類有兩個字符串數組。 非常簡單。 請注意,字符串數組的內容是為了簡化。
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>
我通常在實驗中得到的是人員列表框,但是每個列表項的組合框都是空的。
我可以用它來工作
ItemsSource="{Binding ElementName=listBox, Path=DataContext.Jobs }"/>
但我不想使用ElementName,因為它會將數組的源硬編碼為一個我希望避免的特定列表框。
嘗試類似的東西
ItemsSource="{Binding RelativeSource={RelativeSource Self}, Path=Parent.Jobs}"/>
在網格內尋找Jobs時似乎也不起作用。
朝正確方向稍加推動將大有幫助。
謝謝!
除了在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>
當您僅代表一個人的DataTemplate時,您的JobAssignments實例不存在。 試試下面
ItemsSource="{Binding ElementName= listBox, Path=Jobs}"/>
但我不建議上述步驟。 您需要重構ViewModel邏輯。 我想'Jobs'可以是一個靜態實例,因此您可以執行ax:Static綁定
ItemsSource="{Binding Source={x:Static JobAssignments}, Path=Jobs}"
您可能需要修改對象結構才能像這樣工作:
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; } }
}
然后,您可以刪除問號,然后一切正常。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.