簡體   English   中英

具有兩個列表的ListBox DataTemplate綁定

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM