Silverlight Datagrid выберите правой кнопкой мыши - PullRequest
6 голосов
/ 15 июня 2010

Есть ли способ для события щелчка правой кнопкой мыши выбрать строку в сетке данных набора инструментов?

Я использую контекстное меню набора инструментов, которое работает хорошо, но проблема в том, что только щелчок левой кнопкой мыши может выбрать строкии мне нужно щелкнуть правой кнопкой мыши, чтобы сделать это, если я хочу, чтобы мое контекстное меню работало правильно.

Любая помощь приветствуется

Ответы [ 5 ]

5 голосов
/ 15 июня 2010

Вы можете найти решение здесь .

В основном это выглядит так:

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;
}
3 голосов
/ 05 апреля 2012

Он Поведение, которое поможет вам (вдохновленный этим сообщением в блоге ):

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>
1 голос
/ 24 августа 2010

Этот проект с открытым исходным кодом на Codeplex поддерживает это поведение из коробки и делает гораздо больше, чем это:

http://sl4popupmenu.codeplex.com/

1 голос
/ 23 августа 2010

Спасибо, хорошая идея. Но было указано, что событие with UnloadingRow могло бы быть более эффективным.

private void dg_UnloadingRow(object sender, System.Windows.Controls.DataGridRowEventArgs e)
{
    e.Row.MouseRightButtonDown -= Row_MouseRightButtonDown;
}
0 голосов
/ 10 января 2012

Я попробовал немного другой подход, используя событие LoadingRow в DataGrid.Я не люблю использовать это конкретное событие, если мне не нужно, но, поскольку я не работал с большими объемами данных, это работает довольно хорошо.Единственная вещь, которую я не имею в этом примере, - это команда, используемая для выполнения действия.Вы можете использовать команду для объекта 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);

    }
...