2013-01-13 58 views
6

Tôi muốn xử lý sự kiện SelectionChanged trong phần tử DataFrid WPF cho tương tác người dùng/lựa chọn duy nhất và bỏ qua nếu đó là do ràng buộc hoặc các giá trị đã đặt khác. Bất kỳ ý tưởng làm thế nào tôi sẽ xác định nếu lựa chọn được thay đổi bởi tương tác người dùng? Hoặc bất kỳ sự kiện thay thế nào có thể thực hiện nhiệm vụ tương tự?sự kiện SelectionChanged trong WPF có thể được xử lý chỉ để tương tác với người dùng không?

+0

Bạn có thể hiển thị một số mã mẫu mà bạn đang cố gắng đạt được không? –

Trả lời

10

Có thể thử kết hợp sự kiện SelectionChanged với sự kiện PreviewMouseDown. Khi người dùng nhấp vào hàng, bạn đặt một số thuộc tính và trong SelectionChanged kiểm tra trình xử lý sự kiện nếu thay đổi thuộc tính.

mẫu mã XAML:

<DataGrid SelectionChanged="OnSelectionChanged" PreviewMouseDown="OnPreviewMouseDown"> 
     <!--some code-->   
</DataGrid> 

Mã đằng sau:

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

Cảm ơn bạn Rafal, lừa đã giúp. Cảm ơn bạn! –

+0

Bất cứ ai có thể nghĩ ra một lý do nào đó, tại sao điều này không được thực hiện như sự kiện riêng biệt ...? Sử dụng MVVM-Pattern thay đổi luôn kích hoạt ngay cả khi thiết lập datacontext ....:/+1 Rafal cho thủ thuật này ':) – dba

+0

Tôi nghĩ điều này sẽ thất bại trong nhiều trường hợp: (1) nếu người dùng nhấp vào một cách điều đó không dẫn đến thay đổi lựa chọn (ví dụ như nhấp vào hàng đã chọn hoặc sử dụng công cụ sửa đổi hoặc các nút chuột khác nhau), sau đó lựa chọn thay đổi do ràng buộc, ràng buộc sẽ được xem là hành động của người dùng. (2) Nếu người dùng sử dụng bàn phím để thay đổi lựa chọn, nó sẽ không được xem như là một hành động của người dùng. – hypehuman

0

hi bạn có thể sử dụng trong XAML:

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

và trong mã đằng sau:

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

Một phương pháp khác là xử lý các sự kiện DropDownOpenedDropDownClosed của ComboBox. Điều này là tốt hơn một chút so với câu trả lời chấp nhận của Rafal bởi vì nó ngăn cản cờ boolean bị mắc kẹt là đúng nếu người dùng nhấp vào ComboBox và sau đó nhấp vào một nơi khác gây ra ComboBox để đóng mà không có một lựa chọn được thực hiện. Những gì nó không giải quyết, mặc dù, là nếu ComboBox có bàn phím tập trung và người dùng khai thác các mũi tên lên và xuống để thay đổi lựa chọn.

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 
    } 
} 
Các vấn đề liên quan