代码之家  ›  专栏  ›  技术社区  ›  user302845

单击鼠标右键选择Silverlight Datagrid

  •  6
  • user302845  · 技术社区  · 15 年前

    我使用的工具箱上下文菜单工作得很好,但问题是,只有左键单击才能选择行,如果我希望上下文菜单正常工作,我需要右键单击才能这样做。

    感谢您的帮助

    5 回复  |  直到 15 年前
        1
  •  5
  •   Koynov    15 年前

    你可以找到解决办法 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;
    }
    
        2
  •  3
  •   Samuel Jack    13 年前

    他是一个行为,这将做你的把戏(受此启发) 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>
    
        3
  •  1
  •   Orkun    14 年前

    谢谢,好主意。但是如果指定了with UNLOADIGROW事件,则可以更有效。

    private void dg_UnloadingRow(object sender, System.Windows.Controls.DataGridRowEventArgs e)
    {
        e.Row.MouseRightButtonDown -= Row_MouseRightButtonDown;
    }
    
        4
  •  1
  •   Ziad    14 年前
        5
  •  0
  •   e-rock    13 年前

    我尝试了一种稍微不同的方法,在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);
    
        }