2012-04-04 6 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()); 
    } 
} 
} 
背後途中で私のページ1のthats私のナビゲーションウィンドウのthats

だから、SelectionChangedイベントをトリガする項目をクリックしてSelectionChangedで処理します。ここでは、page2にナビゲートします。

その後、私は、このメソッドがトリガーされた理由さえ知らないナビゲーションウィンドウから、[戻る]ボタンを使用して

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イベントをサブスクライブすることができます

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

UPDあなたは本当のクリックが必要な場合:

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

を次を使用してシリーズをクリックしアクセスすることができます次のようなトリックを使用することができます:

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

クリックを処理できるビューモデルのようなボタンを使用します。

+0

これは機能します。しかし、clickイベントとしてmouseDownイベントを使用するのは本当に良い習慣ですか?私は実際のクリックイベントを持つためにstackPanelのボタンを使用する必要がありますか? 私はまだSelectionChangedがこのタイプのフローの悪いイベントである理由を知りません(それ以外は動作しません) - あなたは非常に良い答えがすぐに私はあなたを受け入れるでしょう。 – braunbaer

+0

SelectionChangedの目的は、SelectedItemプロパティが変更されたときに反応することです。どのようにそれを行うことができる多くの方法があります。ユーザーがListViewItemをクリックするかキーボードキーを使用すると、コードはSelectedItemプロパティに別の値を代入して選択を切り替えることができます。これらのすべてのケースでPage2を開こうとしていますか?そのため、SelectionChangedはあなたにとって悪いのです。クリックが必要な場合はボタンを追加するほうがいいと思うので、私は自分の答えを更新します。より良い解決策は、イベントハンドラの代わりにコマンドを使うべきです。あなたの助けのために –

+0

thx。私は文脈に合っていると思うので、「オープン」コマンドを実装しました。しかし、 "送信者"はPageに変更され、現在の選択を取得するためにmyListView.Items.CurrentItemに戻りました。だから私はもはやボタンが必要ですか?私はコマンドを使用していますが、クリックイベントは使用していませんか? thx – braunbaer

関連する問題