C# 如何识别模板事件的调用方

C# 如何识别模板事件的调用方,c#,wpf,silverlight,C#,Wpf,Silverlight,我有一个ListBox容器数据绑定和模板化,如下所示: <ListBox x:Name="ListBox" ItemsSource="{Binding Source={StaticResource List}}" ItemTemplate="{StaticResource ListTemplate}"> </ListBox> 在我的ListTemplate资源中,我定义了一个包含几个子元素的网格。

我有一个ListBox容器数据绑定和模板化,如下所示:

    <ListBox x:Name="ListBox" 
             ItemsSource="{Binding Source={StaticResource List}}"
             ItemTemplate="{StaticResource ListTemplate}">
    </ListBox>

在我的ListTemplate资源中,我定义了一个包含几个子元素的网格。我在其中一个子元素上设置了一个单击事件处理程序。事件处理程序不是特定于行的,我需要一种(最佳实践)方法来识别在列表框中触发事件的行


从我的数据源中,我有一个与行相对应的唯一ID。我目前没有在数据绑定中公开此ID,但可以。理想情况下,我希望事件处理程序能够识别触发事件的行的ID。

如果您能向我们展示网格的定义,以便更好地了解您的问题,那就太好了

因为我的网格的DataContext包含了我需要的所有数据,所以我要做的是以下几点(我尽可能使用命令,但也使用事件处理程序)

我的网格中的每一行都有一个超链接。为了知道选择了哪一个,我在事件处理程序中获取DataContext,然后将其强制转换到底层对象。一旦我得到了“排”,我就做我需要做的事情

而且,正如安东尼所建议的,我们可以让事情变得更一般

    private void NotificationLinkClick(object sender, RoutedEventArgs e)
    {
        var myDataObject = ((FrameworkElement)sender)
                                             .DataContext as MyDataObject;
        DoSomeWork(myDataObject);
    }
我很确定有更好/更干净的方法,但这是可行的。
HTH

如果您能向我们展示您的网格定义,以便更好地了解您的问题,那就太好了

因为我的网格的DataContext包含了我需要的所有数据,所以我要做的是以下几点(我尽可能使用命令,但也使用事件处理程序)

我的网格中的每一行都有一个超链接。为了知道选择了哪一个,我在事件处理程序中获取DataContext,然后将其强制转换到底层对象。一旦我得到了“排”,我就做我需要做的事情

而且,正如安东尼所建议的,我们可以让事情变得更一般

    private void NotificationLinkClick(object sender, RoutedEventArgs e)
    {
        var myDataObject = ((FrameworkElement)sender)
                                             .DataContext as MyDataObject;
        DoSomeWork(myDataObject);
    }
我很确定有更好/更干净的方法,但这是可行的。
HTH

+1,不,我不认为其他方法一定更好或更干净。如果使用MVVM框架,使用命令可能会更好,但您的方法是最简单的。(我可能会将
Hyperlink
更改为具有
DataContext
属性的最大类型,而不是将代码仅限于处理超链接)。+1,不,我不认为其他方法一定更好或更干净。如果使用MVVM框架,使用命令可能会更好,但您的方法是最简单的。(我可能会将
Hyperlink
更改为具有
DataContext
属性的最大类型,而不是将代码限制为仅处理超链接)。