사용자 상호 작용/선택 전용 인 WPF DataGrid 요소에서 SelectionChanged 이벤트를 처리하고 바인딩 또는 기타 설정 값 때문일 경우 건너 뜁니다. 사용자 상호 작용에 의해 선택이 변경되는지 어떻게 결정합니까? 아니면 유사한 작업을 수행 할 수있는 대체 이벤트입니까?WPF의 SelectionChanged 이벤트는 사용자 상호 작용을 위해서만 처리 될 수 있습니까?
답변
이벤트 PreviewMouseDown
과 함께 SelectionChanged
이벤트를 결합 해보세요. 사용자가 행을 클릭하면 일부 속성이 설정되고 SelectionChanged
이벤트 핸들러는 속성이 변경되었는지 확인합니다.
샘플 코드 XAML :
<DataGrid SelectionChanged="OnSelectionChanged" PreviewMouseDown="OnPreviewMouseDown">
<!--some code-->
</DataGrid>
코드 숨김
bool isUserInteraction;
private void OnSelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (isUserInteraction)
{
//some code
isUserInteraction = false;
}
}
private void OnPreviewMouseDown(object sender, MouseButtonEventArgs e)
{
isUserInteraction = true;
}
Rafal, 그 트릭이 도와 줘서 고마워. 고맙습니다! –
누구나 이유를 생각해 볼 수 있습니다. 왜 이것이 별도의 이벤트로 구현되지 않았습니까? MVVM-Pattern을 사용하면 datacontext .... :/1 Rafal for this trick '설정시에도 변경 사항이 항상 발생합니다. :) – dba
많은 경우 실패합니다. (1) 사용자가 길을 클릭하면 (예 : 이미 선택된 행을 클릭하거나 수정 자나 다른 마우스 버튼을 사용하여) 선택 사항이 변경되지 않은 경우 바인딩은 사용자 조치로 간주됩니다. (2) 사용자가 키보드를 사용하여 선택을 변경하면 사용자 동작으로 보지 않습니다. – hypehuman
안녕하세요 당신은 XAML에서 이것을 사용할 수 있습니다
<ComboBox x:Name="ComboBoxName" SelectionChanged="ComboBox_SelectionChanged">
<ComboBox.Style>
<Style TargetType="ComboBox">
<Style.Triggers>
<Trigger Property="IsDropDownOpen" Value="True">
<Setter Property="IsEditable" Value="True"></Setter>
</Trigger>
</Style.Triggers>
</Style>
</ComboBox.Style>
</ComboBox>
뒤에 코드 :
private void ComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (!((ComboBox)sender).IsEditable) return;
//Do Stuff;
}
을 0
또 다른 방법은 ComboBox의 DropDownOpened
및 DropDownClosed
이벤트를 처리하는 것입니다. 이것은 사용자가 ComboBox를 클릭 한 다음 다른 곳을 클릭하여 ComboBox를 선택하지 않고 닫으면 true로 고정되는 부울 플래그를 방지하기 때문에 Rafal의 대답보다 약간 더 좋습니다. ComboBox에 키보드 포커스가 있고 사용자가 선택을 변경하기 위해 위쪽 화살표와 아래쪽 화살표를 두드리는 경우에는 해결되지 않습니다.
private void Event_ComboBox_DropDownOpened(object sender, EventArgs e)
{
isUserInteraction = true;
}
private void Event_ComboBox_DropDownClosed(object sender, EventArgs e)
{
isUserInteraction = false;
}
private void Event_ComboBox_SelectedChanged(object sender, SelectionChangedEventArgs e)
{
if (isUserInteraction)
{
// Do work
}
}
달성하고자하는 몇 가지 샘플 코드를 보여줄 수 있습니까? –