Коллекция Source отличается DataContext от ListView, используя его - PullRequest
0 голосов
/ 10 ноября 2018

У меня есть следующий DataTemplate для ListView, который использует StackPanel для своей ItemsPanelTemplate.

<DataTemplate x:Key="DayTemplate">
    <Border BorderBrush="Black"
            BorderThickness="2"
            CornerRadius="5"
            Width="150"
            Height="440"
            Background="White">
        <StackPanel Orientation="Vertical">
            <Border BorderBrush="Black"
                    BorderThickness="0 0 0 5"
                    Background="White">
                <StackPanel>
                    <StackPanel.ContextMenu>
                        <ContextMenu>
                            <MenuItem Header="Add Session"
                                      Command="{x:Static cmd:TimetableCommands.AddSession}"/>
                        </ContextMenu>
                    </StackPanel.ContextMenu>
                    <TextBlock FontWeight="Bold"
                               TextAlignment="Center"
                               Text="{Binding Path=DateInfo.Date, Mode=OneWay, Converter={StaticResource DateNoTime}}"/>
                    <TextBlock TextAlignment="Center"
                           FontWeight="Bold"
                           Text="{Binding Path=DateInfo.DayOfWeek}"/>
                </StackPanel>
            </Border>
            <ListBox Name="lbSessions"
                     Background="Transparent"
                     HorizontalAlignment="Center"
                     Visibility="Visible"
                     ItemsSource="{Binding Source={StaticResource SessionList}}"
                     ItemTemplate="{StaticResource SessionTemplate}">
                <ListBox.ItemsPanel>
                    <ItemsPanelTemplate>
                        <StackPanel Orientation="Vertical"/>
                    </ItemsPanelTemplate>
                </ListBox.ItemsPanel>
            </ListBox>
        </StackPanel>
    </Border>
</DataTemplate>

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

<CollectionViewSource Source="{Binding Path=Sessions, Mode=OneWay}"
                      x:Key="SessionList">
    <CollectionViewSource.SortDescriptions>
         <scm:SortDescription PropertyName="StartTime"/>
    </CollectionViewSource.SortDescriptions>
</CollectionViewSource>

При запуске данные не отображаются, а в окне вывода указывается, что источник коллекции пытается получитьданные для списка элементов на уровне окна DataContext, а не DataContext, который использует список (который находится на пару уровней ниже Window ViewModel).

Если я изменю строку

ItemsSource="{Binding Source={StaticResource SessionList}}" 

до

ItemsSource="{Binding Path=Sessions}"

Работает нормально, хотя у меня больше нет функции сортировки источника сбора, которую я действительно хочу использовать, чтобы избежать необходимости писать собственный код сортировки.

Что происходит?и как я могу установить правильный DataContext в источнике коллекции.

1 Ответ

0 голосов
/ 11 ноября 2018

Есть ли причина, по которой вам нужно хранить ваш CollectionViewSource в отдельном ResourceDictionary?

Попробуйте вложить CollectionViewSource в элементы ListBox

<ListBox Name="lbSessions"
         Background="Transparent"
         HorizontalAlignment="Center"
         Visibility="Visible"
         ItemTemplate="{StaticResource SessionTemplate}">
  <ListBox.Items>
    <CollectionViewSource Source="{Binding Path=Sessions, Mode=OneWay}">
      <CollectionViewSource.SortDescriptions>
        <scm:SortDescription PropertyName="StartTime" />
      </CollectionViewSource.SortDescriptions>
    </CollectionViewSource>
  </ListBox.Items>
</ListBox>
...