2012-03-02 8 views
0

データグリッドがあり、データは自分のコレクション(INotifyCollectionChanged)にバインドされています。WPF DataGrid、キーとデータなしを扱います。

新しいレコードを作成するときには、レコードをあらかじめ入力する必要があります。だから、私はdataGrid(CanUserAddRows="False")での追加を無効にし、 "PreviewKeyUp"イベントを処理します(ユーザーがctrl + Nを押すと、メソッド "CreateRecord"を実行して、追加された新しいレコードを通知します)。

このシナリオは完全に...ほとんど動作します。

PreviewKeyUpは、グリッドの一部の要素がフォーカスされている場合(たとえばDataGridRowなど)にのみ発生しました。しかし、もし私が記録を持っていなければ、焦点はなく、イベントは決して解雇されませんでした。

私の質問です:DataGridが空のときに何とかキーctrl + Nを処理することができますか?例えば。トリギングFocusableまたはこれのようなもの。


別の回避策は、「キャッチ」何とか追加する行も、必要なフィールドを埋める、しかし...
標準NewItemPlaceholderは罰金になりますが、EditableItemsはパラメータなしでアイテムのコンストラクタを使用します。
これは私が使用できなかったと思う(または私はちょうど知らなかった:D)

私のデータは、createdUserIdのようなあらかじめ定義された値で作成する必要があります。

明確にするいくつかのコード:

public MyItemsCollection Items { get; set; } 

public MyItemType CreateRecord() 
{ 
    MyItemType item = new MyItemType(userId); 
    item.InitValues(); 
    Items.Add(item); 
    return item; 
} 

/********/ 

public void dataGrid_PreviewKeyUp(object sender, KeyEventArgs e) 
{ 
    if (e.Key == Key.N && e.KeyboardDevice.Modifiers == ModifierKeys.Control) 
    { 
     CreateRecord(); 
     e.Handled = true; 
    } 
} 
<DataGrid AutoGenerateColumns="False" Name="dataGrid" ItemsSource="{Binding Items}" 
      CanUserSortColumns="False" CanUserDeleteRows="True" 
      CanUserAddRows="False" PreviewKeyUp="dataGrid_PreviewKeyUp"> 

いずれも、いくつかのアイデアを持っていますか?

答えて

0

ウィンドウのPreviewKeyUpにアタッチしようとしないでください。データグリッドにレコードがない場合は、強制的に...または無関係に強制してください。そのフォームに人がいれば、そのようなキーを押すためのフォームまたはグリッドに焦点が当てられていれば、それを行うことを暗示することができます。

+0

フォーム上に2つのDataGridがある場合、どのグリッドユーザーが新しい行を追加しようとしているかをどのように認識していますか? – Carnifex

+0

@Carnifexの場合は、オプションでユーザーに "質問する"ことができます。新しいレコードを「グリッドA」または「グリッドB」に追加して、そのレコードから作業してください...または、グリッドの1つが「デフォルト」グリッドそのレコードが追加されます。 – DRapp

+0

"default"グリッドはオプションではありません:2つのグリッド - ヘッダー、行。ユーザーはヘッダー情報を追加してから詳細行を追加することができます。 – Carnifex