右键单击Silverlight Datagrid选择

时间:2010-06-15 12:49:36

标签: c# silverlight datagrid contextmenu

右键单击事件是否有办法在工具箱数据网格中选择一行?

我正在使用工具包上下文菜单,它运行良好,但问题是,只有左键单击才能选择行,如果我希望我的上下文菜单正常工作,我需要右键单击才能这样做。 / p>

感谢任何帮助

5 个答案:

答案 0 :(得分:5)

您可以找到解决方案here

基本上它是这样的:

private void dg_LoadingRow(object sender, DataGridRowEventArgs e)
{
    e.Row.MouseRightButtonDown += new MouseButtonEventHandler(Row_MouseRightButtonDown);
}
void Row_MouseRightButtonDown(object sender, MouseButtonEventArgs e)
{
    dg.SelectedItem = ((sender) as DataGridRow).DataContext;
}

答案 1 :(得分:3)

他是一个能为你做到这一点的行为(灵感来自于这个blog post):

public class SelectRowOnRightClickBehavior : Behavior<DataGrid>
{
    protected override void OnAttached()
    {
        base.OnAttached();

        AssociatedObject.MouseRightButtonDown += HandleRightButtonClick;
    }

    protected override void OnDetaching()
    {
        base.OnDetaching();

        AssociatedObject.MouseRightButtonDown += HandleRightButtonClick;
    }

    private void HandleRightButtonClick(object sender, MouseButtonEventArgs e)
    {
        var elementsUnderMouse = VisualTreeHelper.FindElementsInHostCoordinates(e.GetPosition(null), AssociatedObject);

        var row = elementsUnderMouse
            .OfType<DataGridRow>()
            .FirstOrDefault();

        if (row != null)
            AssociatedObject.SelectedItem = row.DataContext;
    }
}

像这样使用:

<sdk:DataGrid x:Name="DataGrid" Grid.Row="4" 
                  IsReadOnly="True" 
                  ItemsSource="{Binding MyItems}">
        <i:Interaction.Behaviors>
            <b:SelectRowOnRightClickBehavior/>
        </i:Interaction.Behaviors>
</sdk:DataGrid>

答案 2 :(得分:1)

非常感谢。但是,指定UnloadingRow事件可能会更有效。

private void dg_UnloadingRow(object sender, System.Windows.Controls.DataGridRowEventArgs e)
{
    e.Row.MouseRightButtonDown -= Row_MouseRightButtonDown;
}

答案 3 :(得分:1)

Codeplex上的这个开源项目支持开箱即用的这种行为,并且远不止这些:

http://sl4popupmenu.codeplex.com/

答案 4 :(得分:0)

我尝试使用DataGrid中的LoadingRow事件稍微不同的方法。如果我不需要,我不喜欢使用该特定事件,但由于我没有处理大量数据,因此效果非常好。我在此示例中唯一没有的是用于执行操作的命令。您可以在DataContext对象或其他一些机制上使用命令。

    private void DataGrid_LoadingRow(object sender, DataGridRowEventArgs e)
    {
        var contextMenu = new ContextMenu();

        var deleteMenuItem = new MenuItem {Header = "Delete User"};

        contextMenu.Items.Add(deleteMenuItem);

        ContextMenuService.SetContextMenu(e.Row, contextMenu);

    }