2015-11-30 6 views
2

Salut im ayant un problème où une exception de référence null est levée dans mon xaml pour un contrôle utilisateur à l'aide d'un sélecteur de modèle de données et je ne suis honnêtement pas Bien sûr pourquoi. Voici le code ci-dessous et toute aide serait appréciée.Null Reference Exception levée lors de l'utilisation d'un sélecteur de modèle de données dans un contrôle utilisateur WPF

MISE À JOUR il ne se produit que lors de la conception pas lors de l'exécution

Modèle de données de code de sélection:

using System.Windows; 
using System.Windows.Controls; 
using UI.ViewModel; 

namespace UI.DataTemplateSelectors 
{ 
    public class CouponViewerDataTemplateSelector : DataTemplateSelector 
    { 
     public DataTemplate coupon1DataTemplateSelector { get; set; } 
     public DataTemplate coupon2DataTemplateSelector { get; set; } 
     public DataTemplate coupon3DataTemplateSelector { get; set; } 



     public override DataTemplate SelectTemplate(object item, DependencyObject container) 
     { 
      if (item == null) 
       return null; 
      var CouponViewerViewModel = (CouponViewerViewModel)item; 
      switch (CouponViewerViewModel.Coupon.CouponBarcode) 
      { 

       case "994460": 
        return Coupon1DataTemplateSelector; 
       case "994470": 
        return Coupon2DataTemplateSelector; 
       case "994480": 
        return Coupon3DataTemplateSelector; 


      } 
      return null; 
     } 


    } 
} 

XAML (j'effondrés les différents code DataTemplates que le fichier XAML est massive)

<UserControl x:Class="UI.View.CouponViewerView" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:viewModel="clr-namespace:UI.ViewModel" 
     xmlns:converter="clr-namespace:UI.View.Converter" 
     xmlns:converters="clr-namespace:UI.Converters" 
     xmlns:Web="clr-namespace:Web;assembly=Web" 
     xmlns:dataTemplateSelectors="clr-namespace:UI.DataTemplateSelectors" 
     mc:Ignorable="d" 
     d:DataContext="{d:DesignInstance Type=viewModel:CouponViewerViewModel, IsDesignTimeCreatable=True}" 


     Height="1018" Width="720"> 
    <UserControl.Resources> 
     <converter:EmptyStringToVisibilityConverter x:Key="EmptyStringToVisibilityConverter"/> 
     <converters:AppendCharToBeginningAndEndOfStringConverter x:Key="AppendCharToBeginningAndEndOfStringConverter"/> 
     <converters:HexToBackgroundColourConverter x:Key="HexToBackgroundColourConverter"/> 
     <converters:HexToForegroundColourConverter x:Key="HexToForegroundColourConverter"/> 
     <converters:MaxCharcterSelectionNameConverter x:Key="MaxCharcterSelectionNameConverter"/> 
     <converters:DateTimeToSplitDataGridConverter x:Key="DateTimeToSplitDataGridConverter"/> 
     <converters:HeaderFormatterConverter x:Key="HeaderFormatterConverter"/> 

      <DataTemplate x:Key="Coupon1DataTemplateSelector" ...> 

      <DataTemplate x:Key="Coupon2DataTemplateSelector" ...> 

      <DataTemplate x:Key="Coupon3DataTemplateSelector" ...> 

       <dataTemplateSelectors:CouponViewerDataTemplateSelector 

     Coupon1DataTemplateSelector="{StaticResource Coupon1DataTemplateSelector}" 
     Coupon2DataTemplateSelector="{StaticResource Coupon2DataTemplateSelector}" 
     Coupon3DataTemplateSelector ="{StaticResource Coupon3DataTemplateSelector}" 
     x:Key="CouponViewerDataTemplateSelector" /> 

</UserControl.Resources> 

<StackPanel> 
     <StackPanel x:Name="StackPanelToPrint"> 
      <StackPanel.ContextMenu > 
       <ContextMenu> 
        <MenuItem Header="Print" Click="PrintCurrentForm" /> 
        <MenuItem Header="OverLay Image" Command="{Binding Path=OverlayImageToCouponViewerCommand }" /> 
       </ContextMenu> 
      </StackPanel.ContextMenu> 

      <Grid Margin="0,0,0,0"> 

       <TextBlock Text="{Binding DesignTimeError}" Visibility="{Binding DesignTimeError, Converter={StaticResource EmptyStringToVisibilityConverter}}" Grid.ColumnSpan="2" Margin="0,0,0,34" /> 
       <Canvas Grid.ColumnSpan="2" Margin="0,0,0,0"> 
        <Rectangle Fill="Black" Width="8.5" Height="8.5" Canvas.Left="11" Canvas.Top="128" /> 
        <Rectangle Fill="Black" Width="8.5" Height="8.5" Canvas.Left="742.5" Canvas.Top="128" /> 
        <TextBlock Canvas.Left="338" FontSize="9" Foreground="Red" Canvas.Top="1046" Text="{Binding Path=MarkSenseCoupon.CouponBarcode}" /> 
        <TextBlock FontFamily="Free 3 Of 9" Canvas.Left="24" Canvas.Top="1026" FontSize="110" Height="15" Text="{Binding Path=Coupon.CouponBarcode, Converter={StaticResource AppendCharToBeginningAndEndOfStringConverter}}"/> 
        <TextBlock Canvas.Left="409" FontSize="9" Foreground="Red" Canvas.Top="1046" Text="{Binding Path=MarkSenseCoupon.CouponInstance}" /> 
        <TextBlock FontFamily="Free 3 of 9" Canvas.Left="409" Canvas.Top="1026" FontSize="110" Height="15" Text="{Binding Path=Coupon.CouponInstance, Converter={StaticResource AppendCharToBeginningAndEndOfStringConverter}}"/> 
        <Rectangle Fill="Black" Width="8.5" Height="8.5" Canvas.Left="11.5" Canvas.Top="1043" /> 
        <Rectangle Fill="Black" Width="8.5" Height="8.5" Canvas.Left="742.5" Canvas.Top="1043" /> 



       </Canvas> 

       <Image Canvas.ZIndex="1" Source="{Binding Coupon.OverlayImage}" Margin="0,-21,-76,108" Stretch="Fill" x:Name="PrintImageContextMenu" /> 




       <StackPanel Margin="-105,146,66,0" Height="900" VerticalAlignment="Top" > 

        <ContentControl Content="{Binding}" ContentTemplateSelector="{StaticResource CouponViewerDataTemplateSelector}" /> 


       </StackPanel> 

      </Grid> 
     </StackPanel> 

    </StackPanel> 

</UserControl> 

Stack Trace:

at UI.DataTemplateSelectors.CouponViewerDataTemplateSelector.SelectTemplate(Object item, DependencyObject container) 
    at System.Windows.Controls.ContentPresenter.ChooseTemplate() 
    at System.Windows.Controls.ContentPresenter.EnsureTemplate() 
    at System.Windows.Controls.ContentPresenter.OnPreApplyTemplate() 
    at System.Windows.FrameworkElement.ApplyTemplate() 
    at System.Windows.FrameworkElement.MeasureCore(Size availableSize) 
    at System.Windows.UIElement.Measure(Size availableSize) 
    at System.Windows.ContextLayoutManager.UpdateLayout() 
    at System.Windows.UIElement.UpdateLayout() 
+1

Po Un double repli de [Qu'est-ce qu'une exception NullReferenceException et comment puis-je le réparer?] (http://stackoverflow.com/questions/4660142/what-is-a-nullreferenceexception-and-how-do-i-fix-it) – Albireo

+0

Alors, où est l'exception lancée? – JeffRSon

+0

Ill ajouter la trace de la pile maintenant à la question – philmckendry

Répondre

1

Mon collègue qui travaillait à ce sujet avant moi avait ajouté cette ligne de code à la ViewModel sans me remarquer et cela a causé tous les problèmes en raison de son retour avant la conception les données de temps avaient été chargés

public CouponViewerViewModel() 
    { 

     if (DesignerProperties.IsInDesignMode == true) 
     { 
      return; 
     } 
     if (DesignerProperties.IsInDesignMode) 
     { 
      LoadDesignTimeData(); 
     } 

    } 

Toutes mes excuses pour une question stupide à la fin

+0

BTW, il ne sert à rien de comparer un bool avec 'true' ou' false' - soit utiliser le bool dans sa forme actuelle ou l'annuler. Dites-le à votre collègue ... – JeffRSon

0

Les noms de propriété sont sensibles à la casse.

public DataTemplate coupon1DataTemplateSelector { get; set; } 

contre

Coupon1DataTemplateSelector="{StaticResource Coupon1DataTemplateSelector}" 
+0

Excuses J'ai dû modifier mon code pour poser la question ici, dans le code, ils sont tous deux dans le bon cas et ive modifié la question pour refléter cela – philmckendry