简体   繁体   中英

WPF click event handler get textblock text

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.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM