none
DataTemplateSelector NullReferenceException WP8 RRS feed

  • Frage

  • Hi,

    ich versuche schon sein ein paar Tagen vergebens einen DataTemplateSelector in meine Windows Phone 8 App zu implementieren. Mit wp7 hat es noch funktioniert, nun erhalten ich beim binden der Liste an die Listbox die NullReferenceException. Wo ist mein Fehler?

    Bitte um Hilfe.

    Danke & Gruß

    <phone:PhoneApplicationPage
        x:Class="testapp.pivot"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:adcontrol="clr-namespace:Microsoft.Advertising.Mobile.UI;assembly=Microsoft.Advertising.Mobile.UI"
        xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
        xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
        xmlns:toolkit="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone.Controls.Toolkit"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:testapp"
        mc:Ignorable="d"
        FontFamily="{StaticResource PhoneFontFamilyNormal}"
        FontSize="{StaticResource PhoneFontSizeNormal}"
        Foreground="{StaticResource PhoneForegroundBrush}"
        SupportedOrientations="Portrait" Orientation="Portrait"
        shell:SystemTray.IsVisible="False">
    
    
        <!--LayoutRoot is the root grid where all page content is placed-->
        <Grid x:Name="LayoutRoot" Background="Transparent">
            <Grid.RowDefinitions>
                <RowDefinition Height="*"/>
                <RowDefinition Height="Auto"/>
            </Grid.RowDefinitions>
            <Grid Grid.Row="0">
                <!--Pivot Control-->
                <phone:Pivot Title="Testapp" SelectionChanged="Pivot_SelectionChanged" x:Name="pv_main" >
                   
                    <phone:PivotItem Header="{Binding Path=LocalizedResources.pivotChannels, Source={StaticResource LocalizedStrings}}" x:Name="pv_channels">
    
                        <Grid>
                            <Grid.RowDefinitions>
                                <RowDefinition Height="*"/>
                                <RowDefinition Height="Auto"/>
                                <RowDefinition Height="Auto"/>
                            </Grid.RowDefinitions>
    
                            <Grid x:Name="ContentPanel" Grid.Row="0" Margin="10">
                                <ProgressBar x:Name="progressbar" Height="10" IsIndeterminate="False" Visibility="Collapsed"></ProgressBar>
    
                                <ListBox x:Name="lb_channelList">
                                    <ListBox.ItemTemplate>
                                        <DataTemplate>
                                            <local:TemplateSelector Content="{Binding}">
                                                <local:TemplateSelector._channel>
                                                    <DataTemplate>
                                                        <StackPanel Orientation="Horizontal" Background="{StaticResource PhoneAccentBrush}" Margin="0,0,0,5">
                                                            <TextBlock Text="{Binding _name}" Style="{StaticResource PhoneTextLargeStyle}" />
                                                        </StackPanel>
                                                    </DataTemplate>
                                                </local:TemplateSelector._channel>
                                                <local:TemplateSelector._client>
                                                    <DataTemplate>
                                                        <StackPanel Orientation="Horizontal" Margin="20,0,0,5">
                                                            <TextBlock Text="{Binding _name}" Style="{StaticResource PhoneTextLargeStyle}"  Foreground="{StaticResource PhoneAccentBrush}"/>
                                                        </StackPanel>
                                                    </DataTemplate>
                                                </local:TemplateSelector._client>
                                            </local:TemplateSelector>
                                        </DataTemplate>
                                    </ListBox.ItemTemplate>
                                </ListBox>
                            </Grid>
                        </Grid>
                    </phone:PivotItem>
       	</phone:Pivot>
        </Grid>
    
        <Grid Grid.Row="1">
               
        </Grid>
     </Grid>
    
        <toolkit:TransitionService.NavigationInTransition>
            <toolkit:NavigationInTransition>
                <toolkit:NavigationInTransition.Forward>
                    <toolkit:SwivelTransition Mode="ForwardIn" />
                </toolkit:NavigationInTransition.Forward>
                <toolkit:NavigationInTransition.Backward>
                    <toolkit:TurnstileTransition Mode="BackwardIn" />
                </toolkit:NavigationInTransition.Backward>
            </toolkit:NavigationInTransition>
        </toolkit:TransitionService.NavigationInTransition>
        <toolkit:TransitionService.NavigationOutTransition>
            <toolkit:NavigationOutTransition>
                <toolkit:NavigationOutTransition.Forward>
                    <toolkit:TurnstileTransition Mode="ForwardOut" />
                </toolkit:NavigationOutTransition.Forward>
                <toolkit:NavigationOutTransition.Backward>
                    <toolkit:SwivelTransition Mode="BackwardOut" />
                </toolkit:NavigationOutTransition.Backward>
            </toolkit:NavigationOutTransition>
        </toolkit:TransitionService.NavigationOutTransition>
    
    </phone:PhoneApplicationPage>

    [...]
     Protected Overrides Sub OnNavigatedTo(ByVal e As NavigationEventArgs)
            index = NavigationContext.QueryString("selectedItem")
    	Dim liste As New List(Of ChannelClient)
    	liste.Add(New ChannelClient("channel", "a1", 1))
    	liste.Add(New ChannelClient("client", "b1", 2))
    	liste.Add(New ChannelClient("channel", "a2", 1))
    	liste.Add(New ChannelClient("client", "b2", 1))
    	lb_channelList.ItemsSource = liste
    End Sub
    [...]
    Public MustInherit Class DataTemplateSelector
        Inherits ContentControl
        Public Overridable Function SelectTemplate(item As Object, container As DependencyObject) As DataTemplate
            Return Nothing
        End Function
    
        Protected Overrides Sub OnContentChanged(oldContent As Object, newContent As Object)
            MyBase.OnContentChanged(oldContent, newContent)
    
            ContentTemplate = SelectTemplate(newContent, Me)
        End Sub
    End Class
    
    Public Class TemplateSelector
        Inherits DataTemplateSelector
        Private channel As DataTemplate
        Private client As DataTemplate
    
        Public Property _channel() As DataTemplate
            Get
                Return channel
            End Get
            Set(value As DataTemplate)
                channel = value
            End Set
        End Property
    
        Public Property _client() As DataTemplate
            Get
                Return client
            End Get
            Set(value As DataTemplate)
                client = value
            End Set
        End Property
    
        Public Overrides Function SelectTemplate(item As Object, container As DependencyObject) As DataTemplate
            Dim listItem As ChannelClient = TryCast(item, ChannelClient)
    
            If listItem IsNot Nothing Then
                If listItem._typ = "channel" Then
                    Return _channel
                ElseIf listItem._typ = "client" Then
                    Return _client
                Else
                    Return Nothing
                End If
            End If
    
            Return MyBase.SelectTemplate(item, container)
        End Function
    End Class

    Mittwoch, 14. Januar 2015 20:58

Antworten

  • Habe mein Problem gefunden. Lag an was ganz anderem, am contextmenue von der Lib vom Toolkit.
    • Als Antwort markiert obenDev Montag, 19. Januar 2015 09:04
    Montag, 19. Januar 2015 09:04

Alle Antworten

  • Hallo,
    da du schreibst das es unter WP7 noch lief, vermute ich mal das du deine App gerade aktualisierst. Es wäre IMHO besser gleich auf 8.1 zu aktualisieren um von den Silverlight Apps weg zu kommen. Hier könntest du dann mit einer ähnlichen API arbeiten, wie unter Windows 8/8.1.

    Ich habe deinen Code mal in ein neues Projekt kopiert und getestet. Ich erhielt keinen Fehler und der Code funktionierte, wie er soll. Auch die Templates wurden korrekt ausgewählt. Der Fehler dürfte also wahrscheinlich in einer Codezeile liegen, die du nicht gezeigt hast.

    Ich empfehle dir den Code schrittweise zu debuggen und auf das Ausgabefenster zu achten. So sollte sich der Fehler recht schnell finden lassen.


    Tom Lambert - .NET (C#) MVP
    Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets

    Mittwoch, 14. Januar 2015 21:21
  • Hi Koopakiller,

    danke für deine schnelle Antwort. Habe kurz ein neues Projekt erstellt und getestet. Stimmt es funktioniert. Nur leider finde ich den Fehler nicht in meinem bestehenden Projekt. Habe schon den ganzen Code bis auf die o.g. Zeilen auskommentiert.

    Der Fehler muss am Projekt liegen...

    Sonntag, 18. Januar 2015 11:22
  • Habe mein Problem gefunden. Lag an was ganz anderem, am contextmenue von der Lib vom Toolkit.
    • Als Antwort markiert obenDev Montag, 19. Januar 2015 09:04
    Montag, 19. Januar 2015 09:04