Silverlight Datagrid select on right click

后端 未结 5 1830
半阙折子戏
半阙折子戏 2021-01-05 16:34

Is there a way for a right click event to select a row in toolkit datagrid?

I\'m using toolkit context menu which works nicely, but the problem is, only left click i

相关标签:
5条回答
  • 2021-01-05 17:02

    You can find a solution here.

    Basically it goes like this:

    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;
    }
    
    0 讨论(0)
  • 2021-01-05 17:07

    This open source project on Codeplex supports this behavior out of the box and does much more than this:

    http://sl4popupmenu.codeplex.com/

    0 讨论(0)
  • 2021-01-05 17:11

    Thanks good idea. But the with UnloadingRow event could have been more effective had been specified.

    private void dg_UnloadingRow(object sender, System.Windows.Controls.DataGridRowEventArgs e)
    {
        e.Row.MouseRightButtonDown -= Row_MouseRightButtonDown;
    }
    
    0 讨论(0)
  • 2021-01-05 17:11

    I tried a slightly different approach using the LoadingRow event in the DataGrid. I don't like using that particular event if I don't have to, but since I wasn't working with large amounts of data, it works out pretty well. The only thing I don't have in this sample is the command to use to perform the action. You could use a command on the DataContext object or some other mechanism.

        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);
    
        }
    
    0 讨论(0)
  • 2021-01-05 17:14

    He's a Behavior which will do the trick for you (inspired by this 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;
        }
    }
    

    Use it like this:

    <sdk:DataGrid x:Name="DataGrid" Grid.Row="4" 
                      IsReadOnly="True" 
                      ItemsSource="{Binding MyItems}">
            <i:Interaction.Behaviors>
                <b:SelectRowOnRightClickBehavior/>
            </i:Interaction.Behaviors>
    </sdk:DataGrid>
    
    0 讨论(0)
提交回复
热议问题