如何访问网格内的元素?

how to access elements inside of grid?

我有一个包含 DataTemplate 的 lsitbox,并且在该 DataTemplate 中包含一个 Grid。我已将 MouseDown ClickListener 附加到网格。现在我想在每次单击时获取该网格的元素。

<ListBox x:Name="listBox" HorizontalAlignment="Left" Height="222" 
Margin="28,75,0,0" VerticalAlignment="Top" Width="244" ItemTemplate="
{DynamicResource DataTemplate1}" BorderThickness="5,1">
        <ListBox.Resources > 
            <DataTemplate x:Key="DataTemplate1">
                <Grid Width="205" Height="84" MouseDown="ListClickListener">
                    <Label x:Name="nameLabel" Content="{Binding FullName}" 
 HorizontalAlignment="Left" Margin="68,0,0,0" VerticalAlignment="Top" 
 Width="127" Height="31"/>
                    <Label x:Name="numberLabel" Content="{Binding 
 PhoneNumber}" HorizontalAlignment="Right" Margin="0,31,10,0" 
 VerticalAlignment="Top" Width="127" Height="26"/>
                    <Ellipse x:Name="ellipse" HorizontalAlignment="Left" 
 Height="60"  VerticalAlignment="Top" Width="60">
                        <Ellipse.Fill>
                            <ImageBrush ImageSource="{Binding Picture}" 
 Stretch="UniformToFill"/>
                        </Ellipse.Fill>
                    </Ellipse>
                </Grid>
            </DataTemplate>    
        </ListBox.Resources>
    </ListBox>

而.cs里面的方法"ListClickListener"如下:

private void ListClickListener(object sender, MouseButtonEventArgs e)
        {

        }

如果您只需要控件的绑定值,则无需触摸控件即可。事实上,最好不要这样做。您希望能够更改或重新排列 DataTemplate 中的 XAML,而不必担心修复任何其他代码。

您使用一些 class 的集合填充了列表框。这是您想要与之互动的 class,而不是任何混乱的 UI 东西。这在 WPF 中很容易。

例如,标签的内容绑定到列表框项的 DataContext 的全名 属性。将 ((FrameworkElement)sender).DataContext 转换为列表框中显示的项目类型。假设项目 class 被命名为 MyListBoxItemClass:

private void ListClickListener(object sender, MouseButtonEventArgs e)
{
    var vm = (MyListBoxItemClass)((FrameworkElement)sender).DataContext;

    MessageBox.Show("FullName is " + vm.FullName);
}