2010-06-15 16 views
6

Czy istnieje sposób na zdarzenie prawego przycisku myszy, aby wybrać wiersz w datagrid zestawu narzędzi?Silverlight Datagrid wybierz po kliknięciu prawym przyciskiem myszy

Używam menu kontekstowego z toolkitem, które działa ładnie, ale problem polega na tym, że kliknięcie lewym klawiszem myszy jest w stanie wybrać wiersze i potrzebuję odpowiedniego kliknięcia, aby móc to zrobić, jeśli chcę, aby moje menu kontekstowe działało poprawnie.

Każda pomoc jest mile widziana

Odpowiedz

5

można znaleźć rozwiązanie here.

Zasadniczo to idzie tak:

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

Szkoda musimy użyć hacki tak, ale myślę, że to lepsze niż nic. Dzięki –

+0

Zdarzenie MouseRightButtonDown jest dostępne tylko z wersji SL 4.0. Czy istnieje jakieś inne rozwiązanie dla prawego kliknięcia w SL 3.0? – vijaysylvester

1

Thanks dobry pomysł. Ale zdarzenie UnloadingRow mogło być bardziej skuteczne, gdyby zostało określone.

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

Próbowałem nieco inne podejście przy użyciu zdarzenie LoadingRow w DataGrid. Nie lubię używać tego konkretnego wydarzenia, jeśli nie muszę, ale ponieważ nie pracowałem z dużą ilością danych, działa całkiem nieźle. Jedyne, czego nie mam w tym przykładzie, to polecenie, którego należy użyć, aby wykonać akcję. Można użyć polecenia na obiekcie DataContext lub innym mechanizmie.

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); 

    } 
3

To Zachowanie który załatwi za Ciebie (zainspirowany tym 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; 
    } 
} 

Używaj go tak:

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