문제

I have a text block in my xaml:

<DataTemplate x:Key="InterfacesDataTemplate"
              DataType="ca:Interface">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*" />
        </Grid.ColumnDefinitions>
        <TextBlock Grid.Column="1" Text="{Binding Path=Name}" 
                   MouseLeftButtonDown="interface_mouseDown"/>
    </Grid>
</DataTemplate>

On the code behind I have an event handler for click (double-click)

private void interface_mouseDown(object sender, MouseButtonEventArgs e)
{
    var tb = sender as TextBox;
    if (e.ClickCount == 2)
        MessageBox.Show("Yeah interfac " + tb.Text);
}

I'm getting a NullReferenceException.

도움이 되었습니까?

해결책

var tb = sender as TextBox

This results in null because it's actually a TextBlock.

Just change to

var tb = sender as TextBlock

다른 팁

Most likely what sender must to be TextBlock. And for the future you should check the sender on the null in order once again not raise an exception:

var tb = sender as TextBlock;

if (tb != null)
{
    // doing something here
}

To make it compact and easy just do these changings:

private void interface_mouseDown(object sender, MouseButtonEventArgs e)
{
   if (e.ClickCount == 2)
    MessageBox.Show("Yeah interfac " + ((TextBlock)sender).Text);
}

Ohh oops didn't see you were trying to cast as TextBox not TextBlock. Assuming you want TextBlock then look at below:

I don't use code behind events. I try to use commands to do everything. However, one workaround I would immediately try is putting a name on the control and accessing it directly in code behind like so:

    <TextBlock Grid.Column="1" x:Name="MyTextBlock"
           Text="{Binding Path=Name}" MouseLeftButtonDown="interface_mouseDown"/>
        </Grid>
    </DataTemplate>

Then can access in back:

  private void interface_mouseDown(object sender, MouseButtonEventArgs e)
  {
    if (MyTextBlock.ClickCount == 2)
        MessageBox.Show("Yeah interfac " + MyTextBlock.Text);
  }

Also note, i could be wrong but idk if 'ClickCount' is a nav property on the control TextBlock or TextBox.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top