2011-02-14 56 views
2

在我的Silverlight 4 DataGrid控件中,我想附加一個非常簡單的行爲,它在關鍵按鈕上執行一個自定義命令 - 實際上,按下ENTER鍵提交DataGrid中的選定項目。行爲中的Silverlight KeyDown事件

雖然行爲實際工作(見我的代碼...

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

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

...)我有問題,即在DataGrid似乎處理回車按鍵本身並前進到下一行。顯然,發生的是錯誤的行被提交,因爲當我處理按鍵時,行selectedion已經改變。

這裏是XAML:

<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事件?

+0

是否可以添加e.handled = true?如果是這樣,也許這有助於:) – 2011-02-14 12:54:31

+0

@Theun是的,這是可能的,但它已經爲時已晚,我可以設置。當調用OnKeyDown時,它似乎已經被DataGrid處理/使用了 – thmshd 2011-02-14 14:11:17

回答

4

現在猜測現在有點晚了,但我通過繼承數據網格並覆蓋KeyDown方法來設置e.Handled爲true來解決此問題。這會停止DataGrid的默認輸入處理,然後您自己的操作可能會生效。

(顯然,你要替換的DataGrid的情況下,與YourCustomDataGrid的XAML)

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

看看如果使用AddHandler overload與handledEventsToo可以幫助你在這裏。在某些情況下,即使先前的處理程序已經設置了句柄= true,這也允許您調用處理程序。

+0

我已經在上面的示例中使用過載(第三個參數設置爲「true」)。沒有這個,我甚至不會收到這個事件。 – thmshd 2011-02-21 19:30:42

1

不要依賴SelectedRow,使用募集擺在首位的情況下爲您提交的參數行操作。請參閱下面的代碼:

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