2010-03-31 3 views
2

J'ai créé ce modèle, qui utilise un style appliqué à la ContentPresenter pour que je puisse lier Column propriété de l'objet de données à Grid.Column, permettant aux articles de déterminer eux-mêmes quelle colonne du Grid ils vont dans:Pourquoi ai-je une exception NullReferenceException lorsque j'utilise un style sur un ContentPresenter?

<DataTemplate DataType="{x:Type local:MyObject}"> 
    <ItemsControl ItemsSource="{Binding Items}"> 
    <ItemsControl.Resources> 
     <Style TargetType="{x:Type ContentPresenter}"> 
     <Setter Property="Grid.Column" 
       Value="{Binding Column}" /> 
     </Style> 
    </ItemsControl.Resources> 
    <ItemsControl.ItemsPanel> 
     <ItemsPanelTemplate> 
     <Grid> 
      <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="*" /> 
      <ColumnDefinition Width="*" /> 
      <ColumnDefinition Width="*" /> 
      </Grid.ColumnDefinitions> 
     </Grid> 
     </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel> 
    </ItemsControl> 
</DataTemplate> 

Lorsque j'exécute le programme, j'obtiens un NullReferenceException. Le début de la trace de pile hilarante long:

at System.Windows.StyleHelper.ApplyAutoAliasRules(OptimizedTemplateContent optimizedTemplateContent, HybridDictionary childIndexFromChildID, FrameworkTemplate frameworkTemplate, FrugalStructList`1& childRecordFromChildIndex, FrugalStructList`1& triggerSourceRecordFromChildIndex, FrugalStructList`1& resourceDependents, HybridDictionary& dataTriggerRecordFromBinding, Boolean& hasInstanceValues) 
at System.Windows.StyleHelper.ProcessTemplateContent(FrameworkTemplate frameworkTemplate, FrugalStructList`1& childRecordFromChildIndex, FrugalStructList`1& triggerSourceRecordFromChildIndex, FrugalStructList`1& resourceDependents, ItemStructList`1& eventDependents, HybridDictionary& dataTriggerRecordFromBinding, HybridDictionary childIndexFromChildID, Boolean& hasInstanceValues) 
at System.Windows.StyleHelper.SealTemplate(FrameworkTemplate frameworkTemplate, Boolean& isSealed, FrameworkElementFactory templateRoot, TriggerCollection triggers, ResourceDictionary resources, HybridDictionary childIndexFromChildID, FrugalStructList`1& childRecordFromChildIndex, FrugalStructList`1& triggerSourceRecordFromChildIndex, FrugalStructList`1& containerDependents, FrugalStructList`1& resourceDependents, ItemStructList`1& eventDependents, HybridDictionary& triggerActions, HybridDictionary& dataTriggerRecordFromBinding, Boolean& hasInstanceValues, EventHandlersStore& eventHandlersStore) 
at System.Windows.FrameworkTemplate.Seal() 
at System.Windows.StyleHelper.UpdateTemplateCache(FrameworkElement fe, FrameworkTemplate oldTemplate, FrameworkTemplate newTemplate, DependencyProperty templateProperty) 
at System.Windows.Controls.ContentPresenter.OnTemplateChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
at System.Windows.DependencyObject.OnPropertyChanged(DependencyPropertyChangedEventArgs e) 
at System.Windows.FrameworkElement.OnPropertyChanged(DependencyPropertyChangedEventArgs e) 
at System.Windows.DependencyObject.NotifyPropertyChange(DependencyPropertyChangedEventArgs args) 

... etc.

Ce n'est pas la liaison. Je reçois toujours l'erreur si je définis explicitement la valeur dans le setter du style à 0, disons. Et l'erreur disparaît si je supprime le style, bien que tous les éléments se retrouvent dans la colonne 0.

Que se passe-t-il ici? Et comment puis-je déboguer un problème comme celui-ci?

Répondre

3

La résolution du problème s'est avérée simple: déplacez le style du dictionnaire de ressources ItemsControl vers le DataTemplate.

Je ne sais toujours pas pourquoi j'obtenais une exception de référence nulle, cependant.

+0

Merci .. cela m'a sauvé de probablement des heures de temps perdu! – danjarvis

+0

Obtention du même problème mais lorsque le style est défini dans RD – Vitalij

Questions connexes