2012-04-04 5 views
0

NullPointerException이 NavigationWindow에 돌아가는 후

<NavigationWindow x:Class="WpfApplication1.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="800" Width="600" Source="Page1.xaml"> 

<Page x:Class="WpfApplication1.Page1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    mc:Ignorable="d" 
    d:DesignHeight="600" d:DesignWidth="800" 
Title="Page1" Name="IndexPage"> 

<ListView Name="myListView" ItemsSource="{Binding ElementName=IndexPage, Path=SeriesCollection}" ScrollViewer.HorizontalScrollBarVisibility="Disabled" IsSynchronizedWithCurrentItem="True" SelectionChanged="handleSelected"> 
    <ListView.ItemsPanel > 
     <ItemsPanelTemplate> 
      <WrapPanel> 
      </WrapPanel> 
     </ItemsPanelTemplate>    
    </ListView.ItemsPanel> 
    <ListView.ItemTemplate> 
     <DataTemplate> 
      <StackPanel > 
       <Image Width="214" Height="317" Source="{Binding Image}"/> 
       <Label Content="{Binding Name}" /> 
      </StackPanel> 
     </DataTemplate> 
    </ListView.ItemTemplate> 
</ListView> 

페이지 2 단지 빈 해골

코드

namespace WpfApplication1 
{ 
/// <summary> 
/// Interaktionslogik für Page1.xaml 
/// </summary> 
public partial class Page1 : Page 
{ 
    private ObservableCollection<Series> _series = 
     new ObservableCollection<Series>(); 

    public ObservableCollection<Series> SeriesCollection 
    { 
     get { return _series; } 
    } 

    public Page1() 
    { 
     InitializeComponent(); 

     DirectoryInfo baseDir = new DirectoryInfo(@"C:\Serien"); 
     DirectoryInfo[] dirs = baseDir.GetDirectories(); 
     foreach (DirectoryInfo dir in dirs) 
     { 
      Series serie = new Series(dir); 
      Console.WriteLine("adding " + serie.Name); 
      _series.Add(serie); 
     } 

     Console.WriteLine(_series.Count); 
    } 

    public void handleSelected(object sender, RoutedEventArgs args) 
    { 
     Series currentSerie = (Series) myListView.Items.CurrentItem; 

     Page2 page = new Page2(); 
     this.NavigationService.Navigate(page); 

     Console.WriteLine(currentSerie.Name); 
     Console.WriteLine(currentSerie.GetType()); 
     Console.WriteLine(currentSerie.ToString()); 
    } 
} 
} 
뒤에 욕실 내 PAGE1 이잖아 내 탐색 창 이잖아

그래서 SelectionChanged 이벤트를 트리거하여 SelectionChanged에서 처리하는 항목을 클릭하여 page2로 이동합니다 (지금까지는 그렇게 좋았습니다).

는 내가 탐색 창에서 뒤로 가기 (back) 버튼을 사용하고 난이 방법이 트리거 이유를 알고도 모릅니다

this.NavigationService.Navigate(page); 

에서 NullPointerException이 함께 붙어 얻을. 그래서 obviosly 나는 바보 같은 짓을하고있다. Pls는 그것이 무엇인지에 관해 나에게 이야기한다. 시간과 노력에 감사드립니다.

+0

다음 줄이 아닌 예외가 발생 했습니까? 'CurrentItem'과 그러므로'currentSerie'는'null' 일 수도 있습니다. – Clemens

+0

@ 클레멘스는 VS2010이 말하고있는 것을 잘 설명합니다. 또한 콘솔 출력없이 실행하려고했는데 동일한 오류가 발생했습니다. – braunbaer

+0

정확히 'null'이 무엇입니까? 스택 추적을 가지고 있습니까? – Clemens

답변

0

여기에서 문제는 잘못된 이벤트를 처리한다는 것입니다. ListViewItem을 클릭하여 Page2를 열고 싶다고 가정합니다. 따라서 SelectionChanged 대신 마우스 이벤트를 사용해야합니다.

예를 들어, 당신은 당신의 DataTemplate에 StackPanel의 MouseDown 이벤트를 구독 할 수 있습니다 :

<DataTemplate> 
    <StackPanel Background="Transparent" 
       MouseDown="StackPanel_MouseDown"> 
     <Image Width="214" Height="317" Source="{Binding Image}"/> 
     <Label Content="{Binding Name}"/> 
    </StackPanel> 
</DataTemplate> 

다음 사용하여 시리즈를 클릭 액세스 할 수 있습니다 : 당신이 진짜 클릭을해야하는 경우

private void StackPanel_MouseDown(object sender, MouseButtonEventArgs e) 
{ 
    var currentSerie = (Series)((StackPanel)sender).DataContext; 
    ... 
} 

UPD을 다음과 같은 트릭을 사용할 수 있습니다.

<DataTemplate> 
    <Button Click="Button_Click"> 
     <Button.Template> 
      <ControlTemplate TargetType="Button"> 
       <ContentPresenter/> 
      </ControlTemplate> 
     </Button.Template> 
     <StackPanel Background="Transparent"> 
      <Image Width="214" Height="317" Source="{Binding Image}"/> 
      <Label Content="{Binding Name}"/> 
     </StackPanel> 
    </Button> 
</DataTemplate> 

클릭을 처리 할 수있는보기 모델과 같은 Button을 사용합니다.

+0

이 작동합니다. 그러나 mouseDown 이벤트를 클릭 이벤트로 사용하는 것이 좋습니다. 실제 클릭 이벤트가 발생하려면 stackPanel의 버튼을 사용해야합니까? 또한 SelectionChanged가이 유형의 흐름에 대한 나쁜 이벤트 인 이유를 아직 모르겠다. (게다가 작동하지 않는다.) - thx 너는 아주 좋은 답이 될 것이고 나는 곧 너의 대답을 받아 들일 것이다. – braunbaer

+0

SelectionChanged의 목적은 SelectedItem 속성이 변경되었을 때 반응하는 것입니다. 그것이 어떻게 행해지는지 많은 방법이 있습니다. 사용자가 ListViewItem을 클릭하거나 키보드 키를 사용할 수 있으며 코드는 SelectedItem 속성에 다른 값을 할당하여 선택 영역을 전환 할 수 있습니다. 이 모든 경우에 Page2를 열어 보시겠습니까? 그것이 SelectionChanged가 당신에게 나쁜 이유입니다. 클릭이 필요한 경우 버튼을 추가하는 것이 더 좋음에 동의하므로 답변을 업데이트하겠습니다. 더 나은 해결책은 이벤트 처리기 대신 명령을 사용해야합니다. 귀하의 도움을 위해 –

+0

thx. 문맥에 맞는 것 같아 "열기"명령을 구현했습니다. 그런 다음 "보낸 사람"이 Page (페이지)로 변경되고 현재 선택 항목을 가져 오기 위해 myListView.Items.CurrentItem으로 되돌아갔습니다. 그래서 더 이상 버튼이 필요합니까? 클릭 이벤트가 아닌 명령을 사용하고 있습니까? thx – braunbaer