Почему я получаю исключение NullReferenceException при использовании стиля в ContentPresenter? - PullRequest
2 голосов
/ 31 марта 2010

Я создал этот шаблон, который использует стиль, примененный к ContentPresenter, чтобы я мог связать свойство Column объекта данных с Grid.Column, позволяя элементам самим определять, какой столбец Grid они входят в:

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

... и т.д.

Это не обязательство. Я все еще получаю ошибку, если я явно устанавливаю значение в установщике стиля, скажем, 0. И ошибка исчезает, если я удаляю стиль, хотя тогда все элементы заканчиваются в столбце 0.

Что здесь происходит? И как мне отладить такую ​​проблему?

1 Ответ

3 голосов
/ 01 апреля 2010

Исправить проблему оказалось просто: переместите стиль из словаря ресурсов ItemsControl в DataTemplate.

Я все еще не знаю, почему я получаю исключение с нулевой ссылкой.

...