2013-01-13 3 views
6

사용자 상호 작용/선택 전용 인 WPF DataGrid 요소에서 SelectionChanged 이벤트를 처리하고 바인딩 또는 기타 설정 값 때문일 경우 건너 뜁니다. 사용자 상호 작용에 의해 선택이 변경되는지 어떻게 결정합니까? 아니면 유사한 작업을 수행 할 수있는 대체 이벤트입니까?WPF의 SelectionChanged 이벤트는 사용자 상호 작용을 위해서만 처리 될 수 있습니까?

+0

달성하고자하는 몇 가지 샘플 코드를 보여줄 수 있습니까? –

답변

10

이벤트 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; 
} 
+0

Rafal, 그 트릭이 도와 줘서 고마워. 고맙습니다! –

+0

누구나 이유를 생각해 볼 수 있습니다. 왜 이것이 별도의 이벤트로 구현되지 않았습니까? MVVM-Pattern을 사용하면 datacontext .... :/1 Rafal for this trick '설정시에도 변경 사항이 항상 발생합니다. :) – dba

+0

많은 경우 실패합니다. (1) 사용자가 길을 클릭하면 (예 : 이미 선택된 행을 클릭하거나 수정 자나 다른 마우스 버튼을 사용하여) 선택 사항이 변경되지 않은 경우 바인딩은 사용자 조치로 간주됩니다. (2) 사용자가 키보드를 사용하여 선택을 변경하면 사용자 동작으로 보지 않습니다. – hypehuman

0

안녕하세요 당신은 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
0

또 다른 방법은 ComboBox의 DropDownOpenedDropDownClosed 이벤트를 처리하는 것입니다. 이것은 사용자가 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 
    } 
}