2013-07-30 33 views
1

我對WPF非常陌生,我試圖在ListBox中的選定項目發生更改時更新TextBlock中的文本。WPF的新手 - 在代碼中更新TextBlock導致NullReferenceException

我添加了ListBox和TextBlock的到我的XAML:

<Window x:Class="Blend_Test.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" WindowState="Maximized" ResizeMode="NoResize" Width="{DynamicResource {x:Static SystemParameters.PrimaryScreenWidthKey}}" Height="{DynamicResource {x:Static SystemParameters.PrimaryScreenHeightKey}}"> 
<Grid Background="#FFC10000"> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="*"/> 
     <ColumnDefinition Width="*"/> 
    </Grid.ColumnDefinitions> 
    <ListBox Grid.Column="0" Margin="20" FontSize="48" Name="VideoListBox" SelectedIndex="0" Cursor="None" SelectionChanged="VideoListBox_SelectionChanged"> 
     <ListBoxItem Margin="20">Video 1</ListBoxItem> 
     <ListBoxItem Margin="20">Video 2</ListBoxItem> 
     <ListBoxItem Margin="20">Video 3</ListBoxItem> 
     <ListBoxItem Margin="20">Video 4</ListBoxItem> 
    </ListBox> 
    <TextBlock Grid.Column="1" Text="Lorem Ipsum" x:Name="VideoTextBlock" FontSize="48"></TextBlock>   
</Grid> 
</Window> 

但現在我不完全知道該怎麼添加到我後面的代碼。我到目前爲止是:

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
    } 

    private void VideoListBox_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e) 
    { 
     VideoTextBlock.Text = "Test"; 
    } 
} 

但是,當我運行這個我得到一個NullReferenceException錯誤。我想我需要初始化TextBlock,但我不知道如何做到這一點。

+0

它發生在'VideoTextBlock.Text =「Test」;'? – PoweredByOrange

+0

是的,那是錯誤發生的時間。 – MattSavage

+2

這是因爲在你的XAML的'TextBlock'之前創建了'ListBox',並且一旦創建了一個'ListBox','SelectionChanged'事件被觸發 - 注意到在這一點上'TextBlock'還沒有被創建,所以你得到一個'NulReferenceException'。不知道你的設計是什麼,但你可以在更改文本之前檢查'TextBlock'是否爲null。一旦顯示窗口,您會注意到更改選定的項目實際上會更新「TextBlock」。 – PoweredByOrange

回答

3

嘗試使用綁定,而不是一個事件處理程序:

<Window 
    x:Class="Blend_Test.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" 
    WindowState="Maximized" 
    ResizeMode="NoResize" 
    Width="{DynamicResource {x:Static SystemParameters.PrimaryScreenWidthKey}}" 
    Height="{DynamicResource {x:Static SystemParameters.PrimaryScreenHeightKey}}"> 
    <Grid Background="#FFC10000"> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="*" /> 
      <ColumnDefinition Width="*" /> 
     </Grid.ColumnDefinitions> 
     <ListBox 
      Grid.Column="0" 
      Margin="20" 
      FontSize="48" 
      Name="VideoListBox" 
      SelectedIndex="0" 
      Cursor="None"> 
      <ListBoxItem Margin="20">Video 1</ListBoxItem> 
      <ListBoxItem Margin="20">Video 2</ListBoxItem> 
      <ListBoxItem Margin="20">Video 3</ListBoxItem> 
      <ListBoxItem Margin="20">Video 4</ListBoxItem> 
     </ListBox> 
     <TextBlock 
      Grid.Column="1" 
      Text="{Binding SelectedItem.Content, ElementName=VideoListBox}" 
      x:Name="VideoTextBlock" 
      FontSize="48"/> 
    </Grid> 
</Window> 

如果不爲你的工作需要,我只想檢查空您嘗試訪問它之前:

private void VideoListBox_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e) 
{ 
    if (VideoTextBlock != null) 
    { 
     VideoTextBlock.Text = "Test"; 
    } 
} 
+0

這樣做了!謝謝丹。 – MattSavage

相關問題