2013-01-13 10 views
6

WPF DataGrid要素でSelectionChangedイベントを処理して、ユーザーの操作や選択のみを行いたい場合はバインディングやその他の設定値が原因でスキップします。選択がユーザーのやりとりによって変更されるかどうかをどのように判断するか考えていますか?または同様のタスクを行う代替イベントですか?WPFのSelectionChangedイベントは、ユーザーとのやりとりのためだけに処理できますか?

+0

達成しようとしているサンプルコードを表示できますか? –

答えて

10

おそらくSelectionChangedイベントとPreviewMouseDownイベントを組み合わせてみてください。ユーザーが行をクリックするといくつかのプロパティが設定され、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:) – dba

+0

これは多くの場合に失敗すると思います:(1)ユーザーが(例えば、すでに選択されている行をクリックしたり、修飾子や異なるマウスボタンを使用するなど)、バインディングのために選択が変更された場合、バインディングはユーザーアクションとして認識されます。 (2)ユーザがキーボードを使用して選択を変更した場合、それはユーザアクションとしては見えません。 – hypehuman

0

ハイテクXAMLでこれを使用することができます:

private void ComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e) 
    { 
     if (!((ComboBox)sender).IsEditable) return; 
     //Do Stuff; 
    } 
:背後

<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> 

とコードでの0

0

もう1つの方法は、ComboBoxのDropDownOpenedイベントとDropDownClosedイベントを処理することです。これは、ユーザがComboBoxをクリックして他の場所をクリックした場合に、ComboBoxを選択せず​​に閉じるようにした場合、ブール値フラグが真となるのを防ぐので、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 
    } 
} 
関連する問題