如何单击DataTemplate中的TextBlock?

时间:2011-03-08 07:07:57

标签: c# silverlight xaml windows-phone-7

这是我的XAML代码:

<ListBox ItemsSource="{Binding}" Name="listBox">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal">
                <StackPanel Width="370">
                    <TextBlock Text="{Binding AuthorName}"  x:Name="author" MouseEventLeftDown="click"/>
                </StackPanel>
            </StackPanel>                       
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

点击处理程序

private void click(object sender, RoutedEventArgs e)
{
    if(author.Text.Equals("Hi"))
    {
       // Do Something Special
    }
} 

错误是:

  

错误:当前上下文中不存在名称“author”

但我不明白导致此错误的原因或原因。

5 个答案:

答案 0 :(得分:3)

点击处理程序范围内不存在名称为author TextBlock ,因为它位于 DataTemplate 中。发生的事情是author TextBlock 为您的每个数据项创建一次(可能是某个Author类或某类Book类),因此您实际上可以拥有数十个控件名为author

最好将点击处理程序中的sender转换为文本框,然后检查其文本属性。像这样:

private void click(object sender, RoutedEventArgs args)
{
  var textBox = sender as TextBox;
  if(textBox == null)
     return;

  if(textBox.Text.Equals("hi"))
  {
     // Do Something Crazy!
  }
}

答案 1 :(得分:0)

使用专为触摸设计的UI元素(例如HyperlinkBut​​ton或Button)可能更好。您可以按照您想要的方式设置这些样式 - 特别是如果您使用Expression Blend - 但是包含一些关于Touch的视觉反馈是一个很好的设计。

另外 - 我不确定你的==代码 - 你是否将发送者(一个UI元素)与一些字符串表达进行比较?

答案 2 :(得分:0)

首先,你的TextBlock在DataTemplate中定义;在TextBlock上尝试x:Name而不是Name

其次,单击TextBlock可能会非常棘手,因为您必须按TextBlock中的精确像素。为了更轻松地点击您的TextBlock,您可能需要在Background上添加TextBlock,这样点击起来会容易得多。您甚至可以使背景透明:

Background="Transparent"

答案 3 :(得分:0)

使用手势监听器创建一个事件处理程序,如“tap”或double“或者其他。

答案 4 :(得分:0)

使用此...

private void click(object sender, RoutedEventArgs e)
    {
        var author = (TextBlock)sender;

        if (author.Text.Equals("Hi"))
        {
            // Do Something Special    
        }
    }