Как связать вложенные объекты или связывание master-detail в коде? - PullRequest
3 голосов
/ 04 февраля 2009

У меня есть три вложенных класса: Шоу, Сезон и Эпизод, где у шоу есть сезоны, а у сезонов есть эпизоды.

Я хочу связать два списка, чтобы первый перечислял сезоны, а второй - эпизоды в этом сезоне.

Как я могу это сделать? Я предпочитаю устанавливать это в коде, а не в 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 Ответ

8 голосов
/ 04 февраля 2009

Редактировать: добавив немного больше деталей.

Хорошо, допустим, у вас есть объект Show. Это коллекция сезонов. Каждый сезон имеет коллекцию эпизодов. После этого вы можете иметь DataContext для всего элемента управления, который будет объектом Show.

  • Свяжите свой текстовый блок с названием шоу. Text = "{Binding Name"}
  • Привязка предметовСезон сезонов список в коллекцию Seasons. ItemsSource = "{Binding Seasons}" IsSynchronizedWithCurrentItem = "True"
  • Привязать ItemsSource к эпизодам список к текущему сезону Коллекция эпизодов. ItemsSource = "{Binding Времена года / Эпизоды}».

Предполагая, что DataContext вашего Окна является объектом Show, XAML будет:

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

Так что вашим элементам пользовательского интерфейса не нужны имена. Кроме того, перевести это в код довольно легко, и вы были на правильном пути. Основная проблема с вашим кодом заключалась в том, что вы называли списки, когда они действительно не нужны.

Предполагая, что объект Season имеет свойство под названием Episodes, которое является коллекцией объектов Episode, я думаю, что это:

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