기본적으로 여기에 두 가지 질문이 있습니다. 지금 제가 가지고있는 문제를 간단히 소개하겠습니다. 우리가 일반 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;
}
질문 시간 :
- 왜로 나열된
RoutedEventArgs
에RoutingStrategy
입니다Direct
아니요Tunneling
? 모든Preview
이벤트는Tunneling
입니다.- 그리고
더 중요한 : 위의 솔루션은 의도 한대로 내가
CheckItem
내부에 중단 점을 넣을 경우, 선택이 발생하지 않으며, 자세한 사항은 붕괴되어, 모든 작동 작동합니다. 중단 점을 제거하면 항목이 선택되고 에서 이벤트가 중지되지 않은 것처럼 세부 정보 섹션이 열립니다. 왜 그런 일이 일어날까요?
Handled
~
true
을
RoutedEventArgs
에 설정하면 일 뿐이므로 이벤트가 실제로
이으로 처리되어야한다고 생각했습니다.
[편집]
이제나는 '천박한'해결 방법을 발견했습니다, 난 그냥 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
의 발사를 억제하는 데 충분하지 않은 이유는 무엇입니까?
@Blam 이벤트가 발생하는 것은' '을 사용하는 것과 동일하지만 필수적입니다. 그러나 뷰 뒤의 코드에서 이벤트를 처리해야합니다 Caliburn의 Micro attached 속성에 이벤트를 연결하면 뷰 모델에서이 이벤트를 처리 할 수 있습니다. 그래도 'EventSetter'를 사용하고 코드 숨김으로 모든 작업을 수행하더라도 여전히 동일합니다. 이벤트가 진행되고 세부 행이 열립니다. –