2010-09-29 15 views
6

के कारण दिखाई नहीं देता।WPF डेटा ग्रिड समूहीकरण मैं इस त्रुटि संदेश मिलता है बंधन त्रुटि

मेरे बाध्यकारी में क्या गलत है?

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

देखें:

<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" के लिए काम नहीं कर रहा?

त्रुटि: 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> 

मैं वर्तमान 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> 

आप Expander पाठ में वर्ग के नाम देख सकते हैं? मैं इस बिंदु से अपने अवलोकन योग्य चयन कैसे प्राप्त कर सकता हूं?

alt text

उत्तर

2

एक 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 है, फिर भी इसकी अनुमति नहीं है।

+0

यह: _docRepo.GetMaterialList() एक अवलोकन योग्यता देता है। क्या मुझे इसे एक आईनेमरेबल में बदलना चाहिए?यदि हां, तो मैं INOTifyCollectionChanged खो देता हूं जब मैं सामग्री को जोड़ना/हटाना चाहता हूं:/ – Elisabeth

+0

नहीं, अवलोकन योग्य चयन ठीक है - यह ICollectionView को लागू नहीं करता है। –

+0

हास्यास्पद ... मैंने पहले पर्यवेक्षण चयन का उपयोग किया लेकिन यह काम नहीं किया, अब यह एचएम काम करता है ... प्रिये मैंने अभी भी समूह में कुछ संसाधन सामग्री बदल दी है। – Elisabeth

8

सबसे पहले, मैंने एलिसा के संकल्प पर CollectionViewGroup.Name पर यह टिप्पणी की होगी - अगर मेरे पास ऐसा करने के लिए पर्याप्त अंक थे। समूहिंग का उपयोग करने के अपने पहले प्रयास पर भी यह त्रुटि मिली।

इस Name संपत्ति के आबादी, स्रोत संपत्ति के नीचे से, के उपयोग के द्वारा निर्धारित है: _materialList.GroupDescriptions.Add(new PropertyGroupDescription("Schoolclasscode"));

(एक से अधिक PropertyGroupDescription एक दृश्य में जोड़ा अतिरिक्त समूह शैलियों प्रत्येक के लिए लागू करने के लिए कारण बनता है और उनके इसी Name गुण तदनुसार आबादी वाले)

एलिसा के संकल्प स्पष्ट करने के लिए - बस के रूप में नीचे बाध्यकारी बदलने के लिए:।

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

आशा है कि यह बचाता किसी और के लिए समय बचा सकता है।

+1

इच्छा है कि मैं इसे एक से अधिक बार वोट दे सकता हूं !! – CindyH

संबंधित मुद्दे