2010-03-31 3 views
2

나는 그들이로 이동되는 Grid의 열 스스로 결정하는 항목을 허용, 내가 Grid.Column에 데이터 객체의 Column 속성을 바인딩 할 수 있도록 ContentPresenter에 적용되는 스타일을 사용이 템플릿을 만들었습니다ContentPresenter에서 스타일을 사용할 때 NullReferenceException이 발생하는 이유는 무엇입니까?

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

프로그램을 실행하면 NullReferenceException이 표시됩니다. 유쾌하게 긴 스택 추적의 시작 :

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) 

... 등.

바인딩이 아닙니다. 내가 명시 적으로 스타일의 setter 값을 0으로 설정하면 여전히 오류가 발생합니다. 스타일을 삭제하면 오류가 사라지지만 항목의 모든 항목이 0 열로 끝납니다.

여기에 무슨 일이 일어나고 있습니까? 그리고 어떻게 이런 문제를 디버깅합니까?

답변

3

문제를 해결하는 것은 간단하다고 판명되었습니다. ItemsControl의 리소스 사전에서 DataTemplate으로 스타일을 이동하십시오.

여전히 null 참조 예외가 발생하는 이유는 아직 알지 못합니다.

+0

감사합니다. 이로 인해 아마 시간이 낭비 될 것입니다. – danjarvis

+0

RD에서 스타일을 정의 할 때 같은 문제가 발생합니다. – Vitalij

관련 문제