我的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>
在后面的代码中,我有一个用于单击(双击)
的事件处理程序private void interface_mouseDown(object sender, MouseButtonEventArgs e)
{
var tb = sender as TextBox;
if (e.ClickCount == 2)
MessageBox.Show("Yeah interfac " + tb.Text);
}
我收到了NullReferenceException。
答案 0 :(得分:6)
var tb = sender as TextBox
这导致null
,因为它实际上是TextBlock
。
只需更改为
var tb = sender as TextBlock
答案 1 :(得分:1)
sender
最有可能是 TextBlock
。对于将来,您应该检查 null
上的发件人,以便再次不会引发异常:
var tb = sender as TextBlock;
if (tb != null)
{
// doing something here
}
答案 2 :(得分:0)
为了使它变得紧凑和简单,只需做这些改变:
private void interface_mouseDown(object sender, MouseButtonEventArgs e)
{
if (e.ClickCount == 2)
MessageBox.Show("Yeah interfac " + ((TextBlock)sender).Text);
}
答案 3 :(得分:-1)
哦哦oops没有看到你试图扮演TextBox而不是TextBlock。假设您想要TextBlock,请查看以下内容:
我不会在事件背后使用代码。我尝试使用命令来做所有事情。但是,我会立即尝试的一个解决方法是在控件上添加一个名称,并直接在代码后面访问它,如下所示:
<TextBlock Grid.Column="1" x:Name="MyTextBlock"
Text="{Binding Path=Name}" MouseLeftButtonDown="interface_mouseDown"/>
</Grid>
</DataTemplate>
然后可以回访:
private void interface_mouseDown(object sender, MouseButtonEventArgs e)
{
if (MyTextBlock.ClickCount == 2)
MessageBox.Show("Yeah interfac " + MyTextBlock.Text);
}
另请注意,如果&#39; ClickCount&#39;是控件TextBlock或TextBox上的nav属性。