由于绑定错误,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>