SelectionChanged(ListBox)时帧是否为空?

时间:2015-03-24 19:54:44

标签: c# .net wpf listbox

我正在使用ListBox充当"导航"酒吧。当用户选择项目(例如:选项)时,不正确地改变帧的来源。但是,我需要选择第一个项目,以使其看起来像该页面处于活动状态。

我将此添加到我的ListBoxItem样式: <Setter Property="SelectedIndex" Value="0"></Setter>

唯一的问题是,我得到一个Null异常错误: enter image description here

我如何选择&#34;定义PageContainer(Frame)后ListBox中的Item?我是WPF的新手,但我还是不明白为什么在激发selectedIndex事件之前没有定义Frame。

澄清PageNavigation是ListBox,PageContainer是框架。

旁注

我应该:

  1. 甚至将ListBox用于多页软件(例如: CCleaner

  2. 使用框架和页面。 (我见过另一种使用Custom的方法 用户控件,但我认为这有点奇怪)

  3. XAML

    <Style x:Key="PageNavigation" TargetType="{x:Type ListBox}">
        <!--<Setter Property="SelectedIndex" Value="1"></Setter>-->
        <Setter Property="Background" Value="#eee"></Setter>
        <Setter Property="BorderThickness" Value="0"></Setter>
        <Setter Property="Margin" Value="0"></Setter>
        <Setter Property="FontSize" Value="18"></Setter>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="ListBox">
                    <Border Name="Border" BorderThickness="0, 0, 1, 0" BorderBrush="Gray" Background="#eee">
                        <ScrollViewer Focusable="false">
                            <StackPanel IsItemsHost="True"></StackPanel>
                        </ScrollViewer>
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
    

    主窗口内:

            <ListBox Name="PageNavigation" Style="{StaticResource PageNavigation}" ItemContainerStyle="{StaticResource PageNavigationItem}" SelectionChanged="PageNavigation_SelectionChanged">
                <ListBoxItem Tag="Home.xaml">Home</ListBoxItem>
                <ListBoxItem Tag="TestPage.xaml">Test Page</ListBoxItem>
                <ListBoxItem Tag="OptionsPage.xaml">Options</ListBoxItem>
            </ListBox>
    

1 个答案:

答案 0 :(得分:1)

前几天我恰好阅读了"Initialized vs. Loaded"文章,我认为这可能适用于这个问题。

我认为正在发生的是控件保持PageContainerPageNavigation开始初始化。您从文章中学到的是,所有子元素将在父Initialized事件被触发之前完成初始化。

文章还指出:

  

当已经设置了元素的属性时,通常会触发Initialized事件。

话虽如此,我认为您的PageNavigationPageContainer甚至存在之前正在初始化,所以当SelectionChanged被解雇并且您尝试访问该控件时 - 你得到了NRE。

此外,我在过去曾遇到过问题,SelectionChanged会在应用启动期间,在初始化期间触发;然后,当我指定SelectedItem/Index时。我怀疑这也可能是你的问题。

在一天结束时,空测试会阻止NRE,然后只有在PageContainer存在时才会设置源 - 这也是一种常见做法。

if(this.PageContainer != null)
{
    this.PageContainer.Source = new Uri(navigationPath, UriKind.Relative);
}