2011-02-14 2 views
2

내 Silverlight 4 DataGrid 컨트롤에서 키 누름에 사용자 지정 명령을 실행하는 매우 간단한 동작을 첨부하려고했습니다. 실제로는 Enter 키를 누를 때 DataGrid에서 선택한 항목을 커밋합니다. Silverlight KeyDown 이벤트 동작

에 GPRS 실제로 작동하는 동안

(내 코드를 볼 수 ...

//.... in "OnAttached()..." 
this.AssociatedObject.AddHandler(Control.KeyDownEvent, new KeyEventHandler(OnKeyDown), true); 

private void OnKeyDown(object sender, KeyEventArgs e) 
    { 
     if (e.Key == Key.Enter) 
     { 
      InvokeCommand(); 
     } 
    } 

...) 나는 데이터 그리드가 다음 행으로 키를 눌러 자체 진행을 입력하고 처리하는 것 같은 문제를 가지고있다. 분명히 잘못된 행은 커밋됩니다. 왜냐하면 키 프레스를 처리 할 때 행 선택 항목이 이미 변경 되었기 때문입니다.

<data:DataGrid 
     AutoGenerateColumns="False" 
     IsReadOnly="True" 
     ItemsSource="{Binding Path=Data}" 
     SelectedItem="{Binding SelectedRow, Mode=TwoWay}"> 
    <data:DataGrid.Columns> 
     <data:DataGridTextColumn Binding="{Binding A}" /> 
     <data:DataGridTextColumn Binding="{Binding B}" /> 
     <data:DataGridTextColumn Binding="{Binding C}" /> 
    </data:DataGrid.Columns> 
    <i:Interaction.Behaviors> 
     <behaviors:EnterBehavior Command="{Binding CommitCommand}" /> 
    </i:Interaction.Behaviors> 
</data:DataGrid> 

당신은 내가 기본 Enter 이벤트를 방지 할 수있는 방법을 말해 줄 수 : 여기

는 XAML입니까?

+0

e.handled = true를 추가 할 수 있습니까? 그렇다면 어쩌면 도움이 될 것입니다. –

+0

@Theun 가능합니다.하지만 이미 설정할 수있는 곳이 너무 늦었습니다. OnKeyDown이 호출되면 DataGrid에서 이미 처리/사용 된 것으로 보입니다. – thmshd

답변

4

OP를 돕는 데 조금 늦었 겠지만 데이터 격자를 서브 클래 싱하고 KeyDown 메서드를 재정 의하여 e.Handled를 true로 설정하여이 문제를 해결했습니다. DataGrid의 기본 입력 처리가 중지되면 사용자 고유의 액션이 적용될 수 있습니다.

은 제출에 대한 매개 변수로 처음에 이벤트를 발생시킨 열을 사용 SelectedRow에 의존하지 마십시오

public class YourCustomDataGrid : DataGrid 
{ 
    protected override void OnKeyDown(KeyEventArgs e) 
    { 
     // Stop "Enter" selecting the next row in the grid 
     if (e.Key == Key.Enter) 
     { 
      e.Handled = true; 
     } 
     base.OnKeyDown(e); 
    } 
} 
+0

늦어도 늦지는 않았지만 매력처럼 작동했습니다. – thmshd

0

AddHandler overload with handlesEventsToo를 사용하면 여기에서 도움이 될지 확인하십시오. 경우에 따라 이전 핸들러가 이미 handles = true로 설정되어 있어도 핸들러를 호출 할 수 있습니다.

+0

위 예제에서 이미이 오버로드를 사용했습니다 (세 번째 매개 변수는 'true'로 설정 됨). 그것이 없으면, 나는 심지어이 사건을받지 않을 것이다. – thmshd

+0

오, 미안하지만, 나쁘다. 흠. 해당 이벤트의 _preview_ 버전을 구독 할 수 있습니까? – Masterfu

1

을 (물론 당신은 YourCustomDataGrid와 XAML에서 데이터 그리드의 인스턴스를 교체해야) 조작. 아래 코드를 참조하십시오 :

private void OnKeyDown(object sender, KeyEventArgs e) 
{ 
    if (e.Key == Key.Enter) 
    { 
     InvokeCommand(e.OriginalSource); 
    } 
}