嵌套对象的绑定路径

Tin*_*ren 3 data-binding wpf datatemplate collectionviewsource

我刚刚掌握数据绑定,我正在努力绑定到嵌套在对象下方的ObservableCollection中的属性,即在ListView的DataTemplate中我试图绑定到下面的Day.DayDate属性.

它是一个日记应用程序,这是它的结构(编辑,以保持简短):

public class Month : INotifyPropertyChanged
{
    public DateTime StartDate { get; set; }
    public ObservableCollection<Day> Days { get; set; }
}

public class Day : INotifyPropertyChanged
{
    public DateTime DayDate { get; set; }
    public ObservableCollection<Gig> Gigs { get; set; }
}

public class Gig : INotifyPropertyChanged
{
    // Properties of a gig
}
Run Code Online (Sandbox Code Playgroud)

我最初填充像这样的月份日:

private void InitMonth(Month calendarMonth)
{
    // create a Day Object for each day of month, create a gig for each booking on that day (done in LoadDay)
    int daysInMonth = DateTime.DaysInMonth(calendarMonth.StartDate.Year, calendarMonth.StartDate.Month);
    Day dc;
    for (int day_cnt = 0; day_cnt < daysInMonth; day_cnt++)
    {
        dc = new Day();
        dc.DayDate = calendarMonth.StartDate.AddDays(day_cnt);
        calendarMonth.Day.Add(dc);
    }
}
Run Code Online (Sandbox Code Playgroud)

我希望我的主窗口有三个部分:

  1. 月份列表视图(显示其所有日期)
  2. Day ListView(显示选定的Days Gigs)
  3. 内容控制(显示选定的Gigs演出属性)

我坚持第1部分,我的Xaml看起来像这样:

<StackPanel>
  <TextBlock Text="{Binding Path=StartDate, StringFormat={}{0:MMMM}}"/>// Month Heading
  <ListView Name="lv_month"
    ItemsSource="{Binding}"
    ItemTemplate="{StaticResource dayItem}">// Each Day in Month
  </ListView>
</StackPanel>

<DataTemplate x:Key="dayItem">
  <StackPanel>
    <TextBlock Text="{Binding Path=Day.DayDate, StringFormat={}{0:dd ddd}}" />
  </StackPanel>
</DataTemplate>
Run Code Online (Sandbox Code Playgroud)

在TextBlock中,绑定到月份StartDate工作正常,然后我想显示下面列出的所有月份日对象DayDate(最多31个,即01周六到31个月).

它没有显示Day.DayDate!我该如何绑定它?

你现在可以看到'Path = Day.DayDate',但我已经尝试了几乎所有可能性让我相信我从错误的角度接近这个.

任何帮助非常感谢

Arc*_*rus 5

您的Month模板的ListView的ItemsSource需要绑定到Days:

更改

ItemsSource="{Binding}"
Run Code Online (Sandbox Code Playgroud)

ItemsSource="{Binding Days}"
Run Code Online (Sandbox Code Playgroud)

其次,将每个模板视为处理该对象,因此请更改:

<TextBlock Text="{Binding Path=Day.DayDate, StringFormat={}{0:dd ddd}}" />
Run Code Online (Sandbox Code Playgroud)

<TextBlock Text="{Binding Path=DayDate, StringFormat={}{0:dd ddd}}" />
Run Code Online (Sandbox Code Playgroud)

它应该工作!;)