如何在代码中绑定嵌套对象或master-detail-binding?

时间:2009-02-03 21:17:41

标签: c# .net wpf binding master-detail

我有三个嵌套的课程,表演,季节和剧集,其中一个节目有季节,季节有剧集。

我想绑定两个列表框,以便第一个列出季节,第二个列出该季节的剧集。

我该怎么做?我更喜欢在代码中设置它,而不是xaml,但如果你知道如何使用xaml,它总比没有好......

简化的xaml:

<Window>
  <Label name="Showname" />
  <ListBox name="Seasons" />
  <ListBox name="Episodes" />
</Window>

以及一些相关代码:

public partial class Window1 : Window
{
  public Data.Show show { get; set; }
  public Window1()
  {
    this.DataContex = show;

    //Bind shows name to label
    Binding bindName = new Binding("Name");
    ShowName.SetBinding(Label.ContentProperty, bindName);

    //Bind shows seasons to first listbox
    Binding bindSeasons = new Binding("Seasons");
    Seasons.SetBinding(ListBox.ItemsSourceProperty, bindSeasons);
    Seasons.DisplayMemberPath = "SeasonNumber";
    Seasons.IsSyncronizedWithCurrentItem = true;

    //Bind current seasons episodes to second listbox
    Binding bindEpisodes = new Binding("?????");
    Episodes.SetBinding(ListBox.ItemsSourceProperty, bindEpisodes);
    Episodes.DisplayMemberPath = "EpisodeTitle";
  }
}

任何人都有任何线索如何绑定第二个列表框?

1 个答案:

答案 0 :(得分:8)

编辑:添加更多细节。

好的,我们假设你有一个Show对象。这里有一系列季节。每个季节都有一系列剧集。然后,您可以将整个控件的DataContext设置为Show对象。

  • 将TextBlock绑定到节目的名称。 Text =“{Binding Name”}
  • 绑定季节的ItemsSource Seasons系列列表框。 ItemsSource =“{Binding Seasons}” IsSynchronizedWithCurrentItem = “真”
  • 绑定剧集的ItemsSource 当前季节的列表框 剧集集。 的ItemsSource =“{结合 四季/情节}”。

假设您的Window的DataContext是Show对象,则XAML将是:

<Window>
   <TextBlock Text="{Binding Name}" />
   <ListBox ItemsSource="{Binding Seasons}" IsSynchronizedWithCurrentItem="True" />
   <ListBox ItemsSource="{Binding Seasons/Episodes}" />   
</Window>

所以你的UI元素并不需要名字。此外,将其转换为代码非常简单,而且您走的是正确的道路。你的代码的主要问题是你正在命名列表框,当他们真的不需要它时。

假设Season对象有一个名为Episodes的属性,它是Episode对象的集合,我认为它是:

 Binding bindEpisodes = new Binding("Seasons/Episodes");