2010-09-29 15 views
6

me sale este mensaje de error:WPF DataGrid Agrupación no se presenta debido a un error de unión

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

A continuación se muestra el código XAML + modelo de vista importante.

¿Qué pasa con mi encuadernación?

modelo de vista:

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

VISTA:

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

actualización: ¿Por qué es la unión que no trabaja para "Schoolclasscode" a continuación?

error: System.Windows.Data Error: 40 : BindingExpression path error: 'SchoolclassCode' property not found on 'object' ''CollectionViewGroupInternal' (HashCode=15576908)'. BindingExpression:Path=SchoolclassCode; DataItem='CollectionViewGroupInternal' (HashCode=15576908); target element is 'TextBlock' (Name=''); target property is 'Text' (type '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> 

He cambiado la unión ahora a la DataContext actual para ver qué está ahí:

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

¿Ves el nombre de la clase en el texto Expander? ¿Cómo puedo acceder a mi ObservableCollection desde este punto?

alt text

Respuesta

2

Un CollectionViewSource toma una colección y lo envuelve con una ICollectionView. Sin embargo, está vinculando directamente a ICollectionView, que no puede envolver. Establezca su propiedad en el modelo con algún tipo de colección sin procesar IEnumerable) y agréguese a ella.

Aquí está el código para IsSourceValid de CollectionViewSource:

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

Se puede ver que comprueba específicamente para un ICollectionView y no lo permite. Aunque ICollectionView es IEnumerable, todavía no está permitido.

+0

esto: _docRepo.GetMaterialList() devuelve un ObservableCollection . ¿Debo convertir esto en un IEnumerable?en caso afirmativo, pierdo el INotifyCollectionChanged cuando quiero agregar/eliminar material:/ – Elisabeth

+0

No, ObservableCollection está bien, no implementa ICollectionView. –

+0

divertido ... Usé ObservableCollection antes, pero no funcionó, ahora funciona hm ... prolly Todavía cambié algunas cosas de recursos en la agrupación. – Elisabeth

8

En primer lugar, me gustaría haber hecho un comentario sobre la resolución de Elisa sobre CollectionViewGroup.Name - si tuviera puntos suficientes para hacerlo. Obtuve este error también en mi primer intento de usar la agrupación.

El población de esta Name propiedad, de la propiedad de origen debajo, se establece por el uso de: _materialList.GroupDescriptions.Add(new PropertyGroupDescription("Schoolclasscode"));

(Más de un PropertyGroupDescription añadió a una vista provoca estilos adicionales de grupo que deben aplicarse para cada y sus correspondientes propiedades Name pobladas en consecuencia)

Para aclarar la resolución de la Elisa - apenas cambie la unión de la siguiente manera:.

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

Espero que esto ahorre podría ahorrarle tiempo a otra persona.

+1

¡Ojalá pudiera votar esto más de una vez! – CindyH

Cuestiones relacionadas