Группировка WPF DataGrid не отображается из-за ошибки привязки

Я получаю это сообщение об ошибке:

System.Windows.Data Error: 5 : Value produced by BindingExpression is not valid for target property.; Value='System.Windows.Data.ListCollectionView' BindingExpression:Path=MaterialList; DataItem='MaterialBrowserListViewModel' (HashCode=24964411); target element is 'CollectionViewSource' (HashCode=36518048); target property is 'Source' (type 'Object')

Ниже приведен важный код Xaml + ViewModel.

Что не так с моей привязкой?

VIEWMODEL:

public class MaterialBrowserListViewModel : ViewModelBase
    {
        private IDocumentRepository _docRepo;
        private ICollectionView _materialList;

        public MaterialBrowserListViewModel()
        {
            _docRepo= new DocumentRepository();


            MaterialList = CollectionViewSource.GetDefaultView(_docRepo.GetMaterialList());
            //_materialList.GroupDescriptions.Add(new PropertyGroupDescription("Schoolclasscode"));
        }

        public ICollectionView MaterialList
        {
            get { return _materialList; }
            set
            {
                _materialList = value;
                this.RaisePropertyChanged("MaterialList");
            }
        }
    }

VIEW:

    <UserControl.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <!--<ResourceDictionary Source="Themes\DataGrid.Generic.xaml"/>-->
            </ResourceDictionary.MergedDictionaries>

            <CollectionViewSource Source="{Binding MaterialList}"  x:Key="groupedView">
                <CollectionViewSource.GroupDescriptions>
                    <PropertyGroupDescription PropertyName="DocumentName"/>
                </CollectionViewSource.GroupDescriptions>
            </CollectionViewSource>            

            <!-- GroupHeaderStyle -->
            <Style x:Key="GroupHeaderStyle" TargetType="{x:Type GroupItem}">
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="{x:Type GroupItem}">
                            <Expander IsExpanded="True" 
                                      Background="Blue"
                                      Foreground="White">
                                <Expander.Header>
                                    <TextBlock Text="{Binding Name.Name}"/>
                                </Expander.Header>
                                <ItemsPresenter />
                            </Expander>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </ResourceDictionary>

    </UserControl.Resources>
    <Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="10" Background="AliceBlue">
        <Grid.RowDefinitions>
            <RowDefinition Height="35" />
            <RowDefinition Height="25"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>
        <StackPanel Margin="0,0,0,10" Grid.Row="0" Orientation="Horizontal">
            <Button Content="Open" />
            <Button Content="Delete" />
            <Button Content="Export" />
            <Button Content="Clear Filter" />
        </StackPanel>
        <Grid Grid.Row="1">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="{Binding ElementName=col0, Path=ActualWidth}" />
                <ColumnDefinition Width="{Binding ElementName=col1, Path=ActualWidth}" />
                <ColumnDefinition Width="{Binding ElementName=col2, Path=ActualWidth}" />
                <ColumnDefinition Width="{Binding ElementName=col3, Path=ActualWidth}" />
                <ColumnDefinition Width="{Binding ElementName=col4, Path=ActualWidth}" />
                <ColumnDefinition Width="{Binding ElementName=col5, Path=ActualWidth}" />
            </Grid.ColumnDefinitions>
            <DatePicker Grid.Column="0" />
            <TextBox Grid.Column="1" />
            <ComboBox Grid.Column="2" />
            <ComboBox Grid.Column="3" />
            <TextBox Grid.Column="4" />
        </Grid> 
        <DataGrid       
        CanUserAddRows="False"
        CanUserDeleteRows="False"     
        AutoGenerateColumns="False"
        ItemsSource="{Binding Source={StaticResource groupedView}}"        
        Grid.Column="0" 
        Grid.Row="2"
        Grid.ColumnSpan="15"
        x:Name="MaterialGrid"            
        IsSynchronizedWithCurrentItem="True"
        AlternatingRowBackground="AliceBlue"
        VirtualizingStackPanel.VirtualizationMode="Recycling"
        VirtualizingStackPanel.IsVirtualizing="True"
        HeadersVisibility="Column" 
        CanUserResizeColumns="True"
        CanUserSortColumns="True"
        IsReadOnly="True"
            >
            <DataGrid.GroupStyle>
                <GroupStyle ContainerStyle="{StaticResource GroupHeaderStyle}">
                    <GroupStyle.Panel>
                        <ItemsPanelTemplate>
                            <DataGridRowsPresenter/>
                        </ItemsPanelTemplate>
                    </GroupStyle.Panel>
                </GroupStyle>
            </DataGrid.GroupStyle>
            <DataGrid.Columns>
                <DataGridTextColumn Binding="{Binding Schoolday}" x:Name="col0" Header="Date" />
                <DataGridTextColumn Binding="{Binding Period}" x:Name="col1" Header="Period" />
                <DataGridTextColumn Binding="{Binding SchoolclassCode}" x:Name="col2"  Header="Class code" />
                <DataGridTextColumn Binding="{Binding DocumentName}" x:Name="col3"  Header="Document name" />
                <DataGridTextColumn Binding="{Binding Keywords}" x:Name="col4"  Header="Keywords" />
                <DataGridTextColumn Binding="{Binding DocumentId}" x:Name="col5"  Header="Doc Id" />
            </DataGrid.Columns>
        </DataGrid>
    </Grid>
</UserControl>

Обновление : почему привязка не работает для "Schoolclasscode" ниже?

Ошибка: Система. Ошибка Windows.Data: 40: ошибка пути BindingExpression: свойство 'SchoolclassCode' не найдено в 'объекте' '' CollectionViewGroupInternal '(HashCode = 15576908)'. BindingExpression: Путь = SchoolclassCode; DataItem = 'CollectionViewGroupInternal' (HashCode = 15576908); целевой элемент - TextBlock (Name = ''); целевым свойством является 'Text' (тип 'String')

<!-- GroupHeaderStyle -->
            <Style x:Key="GroupHeaderStyle" TargetType="{x:Type GroupItem}">
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="{x:Type GroupItem}">
                            <Expander IsExpanded="True" 
                                      Background="AliceBlue"
                                      Foreground="White">
                                <Expander.Header>
                                    <TextBlock Text="{Binding SchoolclassCode}"/>
                                </Expander.Header>
                                <ItemsPresenter />
                            </Expander>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>

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

  <DataGrid       
        CanUserAddRows="False"
        CanUserDeleteRows="False"     
        AutoGenerateColumns="False"
        ItemsSource="{Binding Source={StaticResource ResourceKey=groupedView}}"      
        Grid.Column="0" 
        Grid.Row="2"
        Grid.ColumnSpan="15"
        x:Name="MaterialGrid"            
        IsSynchronizedWithCurrentItem="True"
        AlternatingRowBackground="AliceBlue"
        VirtualizingStackPanel.VirtualizationMode="Recycling"
        VirtualizingStackPanel.IsVirtualizing="True"
        HeadersVisibility="Column" 
        CanUserResizeColumns="True"
        CanUserSortColumns="True"
        IsReadOnly="True"
            >
            <DataGrid.GroupStyle>
                <GroupStyle>
                    <GroupStyle.ContainerStyle>
                        <Style TargetType="{x:Type GroupItem}">
                            <Setter Property="Template">
                                <Setter.Value>
                                    <ControlTemplate TargetType="{x:Type GroupItem}">
                                        <Expander IsExpanded="True">
                                            <Expander.Header>
                                                <TextBlock Foreground="Black" Text="{Binding }"/>
                                            </Expander.Header>
                                            <ItemsPresenter />
                                        </Expander>
                                    </ControlTemplate>
                                </Setter.Value>
                            </Setter>
                        </Style>
                    </GroupStyle.ContainerStyle>
                </GroupStyle>
            </DataGrid.GroupStyle>
            <DataGrid.Columns>
                <DataGridTextColumn Binding="{Binding Schoolday}" x:Name="col0" Header="Date" />
                <DataGridTextColumn Binding="{Binding Period}" x:Name="col1" Header="Period" />
                <DataGridTextColumn Binding="{Binding SchoolclassCode}" x:Name="col2"  Header="Class code" />
                <DataGridTextColumn Binding="{Binding DocumentName}" x:Name="col3"  Header="Document name" />
                <DataGridTextColumn Binding="{Binding Keywords}" x:Name="col4" Width="*"  Header="Keywords" />
                <!--<DataGridTextColumn Binding="{Binding DocumentId}" x:Name="col5"  Header="Doc Id" />-->
            </DataGrid.Columns>
        </DataGrid>

Вы видите название класса в Expander Text? Как я могу получить доступ к моей ObservableCollection с этого момента?

alt text

6
задан Elisabeth 30 September 2010 в 18:47
поделиться