2015-11-30 1 views
2

Привет, у меня возникла проблема, когда в моем xaml генерируется нулевое Исключение исключения для пользовательского элемента управления, используя селектор шаблонов данных, и я честно не Конечно, почему. Вот приведенный ниже код, и любая помощь будет оценена по достоинству.Null Reference Исключение, возникающее при использовании селектора шаблонов данных в пользовательском элементе управления WPF

UPDATE это происходит только во время разработки не во время выполнения

Data Template Selector код:

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 (я разрушился код разных DataTemplates как файл XAML массивен)

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

Трассировка стека:

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 дублирующий элемент [Что такое исключение NullReferenceException и как его исправить?] (http://stackoverflow.com/questions/4660142/what-is-a-nullreferenceexception-and-how-do-i-fix-it) – Albireo

+0

Так где же заброшено исключение? – JeffRSon

+0

Изначально добавьте трассировку стека на вопрос – philmckendry

ответ

1

Мой Коллега, который работал над этим, прежде чем я добавил эту строку кода в ViewModel без меня заметил, и это вызвало все проблемы из-за его возвращения, прежде чем дизайн данные времени были загружены

public CouponViewerViewModel() 
    { 

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

    } 

Извиняюсь за глупый вопрос, в конце концов

+0

BTW, нет смысла сравнивать bool с 'true' или' false' - либо использовать bool в качестве его, либо отрицать. Расскажите об этом своему коллеге ... – JeffRSon

0

Имена объектов чувствительны к регистру.

public DataTemplate coupon1DataTemplateSelector { get; set; } 

против

Coupon1DataTemplateSelector="{StaticResource Coupon1DataTemplateSelector}" 
+0

Извините, мне пришлось изменить свой код, чтобы задать вопрос здесь, в коде они оба в правильном случае, и ive изменил вопрос, чтобы отразить это – philmckendry

Смежные вопросы