由于绑定错误,WPF DataGrid分组未显示

由于绑定错误,WPF DataGrid分组未显示,wpf,mvvm,datagrid,grouping,Wpf,Mvvm,Datagrid,Grouping,我收到以下错误消息: 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=249

我收到以下错误消息:

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代码

我的装订有什么问题

视图模型:

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");
            }
        }
    }
视图:

我现在已将绑定更改为当前datacontext,以查看其中的内容:

  <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>

你在文本中看到类名了吗?我如何从这一点访问我的ObservableCollection


CollectionViewSource获取一个集合并用ICollectionView包装它。但是,您将直接绑定到它无法包装的
ICollectionView
。将模型中的属性设置为一些原始集合类型(IEnumerable)并绑定到它

以下是CollectionViewSource的IsSourceValid的代码:

private static bool IsSourceValid(object o)
{
    if (((o != null) && !(o is IEnumerable)) && (!(o is IListSource) && !(o is DataSourceProvider)))
    {
        return false;
    }
    return !(o is ICollectionView);
}

您可以看到它专门检查ICollectionView并禁止它。尽管ICollectionView是IEnumerable,但它仍然是不允许的。

首先,如果我有足够的分数,我会对Elisa关于
CollectionViewGroup.Name的决议发表评论。在我第一次尝试使用分组时也出现此错误

Name
属性的填充(来自下面的源属性)通过使用以下项进行设置:
\u materialList.groupdescription.Add(新属性groupdescription(“学校类代码”)

(添加到一个视图中的多个
PropertyGroupDescription
会导致为每个视图应用附加的组样式,并相应填充相应的
Name
属性。)

为了澄清Elisa的分辨率,只需按以下方式更改结合:

<Expander IsExpanded="True" Background="AliceBlue" Foreground="White">
    <Expander.Header>
        <TextBlock Text="{Binding Name}"/>
    </Expander.Header>
    <ItemsPresenter />
</Expander>


希望这可以为其他人节省时间。

this:\u docRepo.GetMaterialList()返回一个可观察的集合。我应该把它变成一个IEnumerable吗?如果是,则当我要添加/删除材料时,我会松开INotifyCollectionChanged:/否,ObservableCollection很好-它没有实现ICollectionView。有趣。。。我以前使用过ObservableCollection,但它不起作用,现在它起作用了。。。首先,我仍然更改了分组中的一些资源。@Philip OK,它几乎可以工作了。。。我已经用一个进一步的问题更新了线程!:)@Lisa我想把你的更新分为一个新问题-将CollectionViewSource绑定到ICollectionView是一个独立的好问题(对于伟大的google power!),而将两者结合起来会让你有点难以理解:)不过,让我推荐一篇关于调试绑定问题的优秀文章:
private static bool IsSourceValid(object o)
{
    if (((o != null) && !(o is IEnumerable)) && (!(o is IListSource) && !(o is DataSourceProvider)))
    {
        return false;
    }
    return !(o is ICollectionView);
}
<Expander IsExpanded="True" Background="AliceBlue" Foreground="White">
    <Expander.Header>
        <TextBlock Text="{Binding Name}"/>
    </Expander.Header>
    <ItemsPresenter />
</Expander>