2012-08-04 3 views
0

기본적으로 여기에 두 가지 질문이 있습니다. 지금 제가 가지고있는 문제를 간단히 소개하겠습니다. 우리가 일반 DataGrid를 가지고 있다고 가정하고, 사용자 정의 기능을 위해 행에 PreviewMouseRightButtonDown을 적용하려고 시도하고 동시에 선택을 피하십시오. 그러면 Details 뷰가 확장됩니다. 나는 this post would help; it was directed at ListView, but with few adjustment it should work the same, right?PreviewMouseRightButtonDown 라우트 된 이벤트 및 WPF DataGrid


왜 당신이 그렇게 할 것이라고 생각?으로 문의하십시오. 주 프로젝트 세부 정보 섹션에서 데이터베이스로의 여행이 길어지고 마우스 오른쪽 단추로 클릭하면 컬렉션의 뷰 모델에서 적절한 bool 플래그 속성 만 설정되기 때문에 마우스 오른쪽 단추로 정보를 열지 않도록하고 싶습니다.


MainWindowView.xaml:

<DataGrid AutoGenerateColumns="False" RowDetailsVisibilityMode="VisibleWhenSelected"> 
    <!-- Columns ommitted for brevity --> 
<DataGrid.ItemContainerStyle> 
      <Style TargetType="{x:Type DataGridRow}"> 
      <!-- Since I'm using Caliburn Micro anyway, I'm going to redirect the event to view model. It doesn't really matter, issue exists with EventSetter too. --> 
       <Setter Property="cal:Message.Attach" Value="[Event PreviewMouseRightButtonDown] = [Action CheckItem($eventArgs, $source]"/> 
      </Style> 
     </DataGrid.ItemContainerStyle> 
</DataGrid> 

MainWindowViewModel.cs:

public void CheckItem(RoutedEventArgs args, object source) 
{ 
    var row = source as DataGridRow; 

    if (row != null) 
    { 
     var item = (ItemViewModel)row.Item; 
     item.IsChecked = true; 
    } 

    args.Handled = true; 
} 

질문 시간 :

  • 왜로 나열된 RoutedEventArgsRoutingStrategy입니다Direct 아니요 Tunneling? 모든 Preview 이벤트는 Tunneling입니다. enter image description here

    • 그리고

  • 더 중요한 : 위의 솔루션은 의도 한대로 내가 CheckItem 내부에 중단 점을 넣을 경우, 선택이 발생하지 않으며, 자세한 사항은 붕괴되어, 모든 작동 작동합니다. 중단 점을 제거하면 항목이 선택되고 에서 이벤트가 중지되지 않은 것처럼 세부 정보 섹션이 열립니다. 왜 그런 일이 일어날까요? Handled ~ trueRoutedEventArgs에 설정하면 일 뿐이므로 이벤트가 실제로 으로 처리되어야한다고 생각했습니다.

[편집]

이제

나는 '천박한'해결 방법을 발견했습니다, 난 그냥 PreviewMouseDown 이벤트에 첨부 할 수 있습니다 : 다음

bool rightClick; 

public void MouseDown(object source, MouseEventArgs args) 
{ 
    rightClick = false; 

    if (args.RightButton == MouseButtonState.Pressed) 
    { 
     rightClick = true; 
     //do the checking stuff here 
    } 
} 

SelectionChanged에 훅 이벤트 :

public void SelectionChanged(DataGrid source, SelectionChangedEventArgs args) 
{ 
    if (rightClick) 
     source.SelectedIndex = -1;   
} 

내 경우에는 효과가 있지만 주관적으로 매우 냄새가 나기 때문에 다른 제안을 할 수 있습니다. 특히 eventArgs.Handled = true의 간단한 마우스 이벤트가 나중에 SelectionChanged의 발사를 억제하는 데 충분하지 않은 이유는 무엇입니까?

+0

@Blam 이벤트가 발생하는 것은''을 사용하는 것과 동일하지만 필수적입니다. 그러나 뷰 뒤의 코드에서 이벤트를 처리해야합니다 Caliburn의 Micro attached 속성에 이벤트를 연결하면 뷰 모델에서이 이벤트를 처리 할 수 ​​있습니다. 그래도 'EventSetter'를 사용하고 코드 숨김으로 모든 작업을 수행하더라도 여전히 동일합니다. 이벤트가 진행되고 세부 행이 열립니다. –

답변

0

Down 대신 PreviewMouseRightButtonUp을 처리하면 원하는 효과가 나타납니다 (아래쪽이 아니라 위로 선택해야합니다).

PreviewMouseRightButtonDown에 대한 MSDN 페이지는 라우팅 전략이 '직접'해야한다라고하고 Routed Events Overview 페이지는 말한다 :

터널링 이벤트는 또한 때때로 사용된다 때문에 명명 규칙의 미리보기 이벤트라고합니다 쌍을 위해.

그래서 어쩌면 터널링 이벤트는 일반적으로 이벤트를 미리 볼 수 있습니다,하지만 정말 그 미리보기 이벤트가 터널링 될 필요가 말을하지 않습니다)

편집 : MouseDown 대 PreviewMouseDown 같은 다른 이벤트를 보면

을 그들은 터널링과 버블이지만 어쩌면 오른쪽/왼쪽 버튼 이벤트는 직접적으로 수행됩니다.

+0

네가 맞아,'PreviewMouseRightButtonUp'은 내가 원했던대로 작동한다. 이상한 점은 'PreviewMouseDown'은 그렇지 않습니다 ... 어쨌든, 그 점을 지적 해 주셔서 감사 드리며, 나는이 이벤트에서 너무 많이 섞여서 Up 버전을 시도조차하지 않았습니다. :) 그것이 내 주요 문제를 해결하기 때문에, 나는 이것을 대답으로 표시 할 것이다. –

관련 문제