Domanda

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.

È stato utile?

Soluzione

var tb = sender as TextBox

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

Just change to

var tb = sender as TextBlock

Altri suggerimenti

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top