2013-03-21 3 views
5

मुझे पता है कि इस सवाल से पहले पूछा गया है, लेकिन मुझे वह नहीं मिला जो मैं ढूंढ रहा हूं।कैसे रद्द करें Datagrid चयन WPF में ईवेंट बदल गया?

private void dataGrid1_SelectionChanged(object sender, SelectionChangedEventArgs e) 
     { 

if (oOrdItem.ItemNo == 0) 
       { 
        e.Handled = true; 
        MessageBox.Show("Please save the order item", "Save"); 
        return; 
       } 
} 

यहां तक ​​कि अगर मैं e.Handled = true; फोन यह datagrid पंक्ति का चयन करेंगे। मैं dataGrid1.SelectedIndex =-1; पर कॉल नहीं करना चाहता क्योंकि यह फिर से चयन किए गए ईवेंट को ट्रिगर करेगा। मैंने dataGrid1.UnSelectAll(); भी चयन किए गए ईवेंट को रद्द करने का कोई अन्य तरीका प्रयास किया?

उत्तर

0

क्या आपने वैकल्पिक कार्यान्वयन के बारे में सोचा था? मैं Binding पर SelectedItem बदलने से पहले एक चेक विधि पर सोच रहा हूं। एक उदाहरण:

<DataGrid ItemsSource="..." SelectedItem="{Binding SelectedEntry}" /> 

और अंतर्निहित वीएम ऐसा दिखाई दे सकता:

public class SampleVm : ViewModelBase//assuming that you are using such a base class 
{ 
    private object _selectedEntry; 
    public object SelectedEntry 
    { 
     get { return _selectedEntry; } 
     set 
     { 
      if (!SavePrevItem()) 
       return; 

      _selectedEntry = value; 
      RaisePropertyChanged("SelectedItem"); // or something similar 
     } 
    } 

    private bool SavePrevItem() 
    { 
     // your logic here 
    } 
} 
+1

क्या आप वाकई यह काम करेंगे? मुझे लगता है कि चयन बदला जाएगा लेकिन चयनित एंटर्री नहीं – Demarsch

1

मैं चयनित जवाब से विधि सहित चयन बदल घटना, रद्द करने के लिए प्रयास करने के लिए विभिन्न तरीकों का इस्तेमाल किया, लेकिन उनमें से कोई भी काम नहीं किया। लेकिन यह मेरे लिए महान काम किया:

datagrid के लिए PreviewMouseDown घटना हैंडलर का उपयोग करना:

private void dataGrid_PreviewMouseDown(object sender, MouseButtonEventArgs e) 
{ 
    //get the item I am clicking on (replace MyDataClass with datatype in datagrid) 
    var myItem = (e.OriginalSource as FrameworkElement).DataContext as MyDataClass; 

    //check if item is different from currently selected item 
    if (myItem != dataGrid.SelectedItem) 
    { 
     //save message dialog 
     MessageBoxResult result = MessageBox.Show("Changes will be lost. Are you sure?", "Confirmation", MessageBoxButton.YesNo, MessageBoxImage.Question); 

     //if click no, then cancel the event 
     if (result == MessageBoxResult.No) 
     { 
      e.Handled = true; 
     } 
     else 
     { 
      //otherwise, reinvoke the click event 
      dataGrid.Dispatcher.BeginInvoke(
       new Action(() => 
       { 
       RoutedEventArgs args = new MouseButtonEventArgs(e.MouseDevice, 0, e.ChangedButton); 
       args.RoutedEvent = UIElement.MouseDownEvent; 
       (e.OriginalSource as UIElement).RaiseEvent(args); 
       }), 
       System.Windows.Threading.DispatcherPriority.Input); 
      } 
     } 
    } 
} 

यह सफलतापूर्वक चयनित उपयोगकर्ता क्लिक करता है तो वर्तमान पंक्ति रहता है "नहीं", और वे क्लिक करते हैं " हां ", फिर निष्पादन सामान्य के रूप में जारी रहेगा। उम्मीद है कि यह भविष्य में किसी की मदद करता है, क्योंकि ऐसा लगता है कि ऐसा लगता है कि यह एक साधारण समस्या के लिए काम करेगा।

संबंधित मुद्दे