Wpf 如何在行为中附加到DataGridCell.Selected事件?

Wpf 如何在行为中附加到DataGridCell.Selected事件?,wpf,datagrid,behavior,datagridcell,Wpf,Datagrid,Behavior,Datagridcell,我正在使用DataGridCell.Slected在我的代码背后做一些事情 <DataGrid DataGridCell.Selected="ArticlesGrid_OnSelected> 但是我想改用行为,我不知道如何在我的行为中附加到事件 public class MyBehavior : Behavior<DataGrid> { protected override void OnAttached() {

我正在使用DataGridCell.Slected在我的代码背后做一些事情

<DataGrid DataGridCell.Selected="ArticlesGrid_OnSelected>
但是我想改用行为,我不知道如何在我的行为中附加到事件

public class MyBehavior : Behavior<DataGrid>
    {
        protected override void OnAttached()
        {
            //don't know how to attach to the event
        }

        protected override void OnDetaching()
        {

        }
}

但是我不知道如何在OnDetaching方法中删除此事件处理程序。

您可以在AssociatedObject属性中获得行为的目标。所以你可以这样做:

public class MyBehavior : Behavior<DataGrid>
{
    protected override void OnAttached()
    {
        AssociatedObject.SelectionChanged += MyEventHandler;
    }

    protected override void OnDetaching()
    {
        AssociatedObject.SelectionChanged -= MyEventHandler;
    }

    protected void MyEventHandler(object sender, SelectionChangedEventArgs e) {
        // Do stuff
    }
 }
Xaml


我知道AssociatedObject,但我不确定您的事件是否与我在XAML中使用的事件相同。没错,这是一个不同的事件。从行为中订阅它并不简单,因为它不在可视化树上,而不是DataGrid上。要做到这一点,你可以你事件触发我使用事件管理器来获得相同的事件,但我不知道这是否是一个好方法编辑我的第一篇文章来显示它。使用行为会很好,因为我希望在其他一些数据网格中使用这种行为,因为a行为很好并且易于附加。那么在这种情况下,EventTrigger应该是您真正要使用的行为。据我所知,我希望在这一点上得到纠正。如果某个元素路由事件属于另一种类型,则不能订阅该事件,除非您继承该元素并从其中订阅该事件。如果事件属于DataGrid而不是DataGridCell,则不会出现此问题。谢谢,我将使用EventTriggers测试它:
EventManager.RegisterClassHandler(AssociatedType, DataGridCell.SelectedEvent, new RoutedEventHandler(ArticlesGrid_OnSelected));
public class MyBehavior : Behavior<DataGrid>
{
    protected override void OnAttached()
    {
        AssociatedObject.SelectionChanged += MyEventHandler;
    }

    protected override void OnDetaching()
    {
        AssociatedObject.SelectionChanged -= MyEventHandler;
    }

    protected void MyEventHandler(object sender, SelectionChangedEventArgs e) {
        // Do stuff
    }
 }
<DataGrid>
    <i:Interaction.Behaviors>
        <local:MyBehavior/>
    </i:Interaction.Behaviors>
</DataGrid>