2009-08-04 34 views
12

Tôi có một DataGrid trong WPF mà tôi đang ràng buộc với một đối tượng.WPF Toolkit Datagrid - làm thế nào để bạn tắt lựa chọn?

Tôi có một DataGridCheckBoxColumn trên đó mà tôi muốn người dùng có thể đi qua và đánh dấu vào những gì họ muốn. Vấn đề là họ phải bấm hai lần, một lần để lựa chọn sau đó một lần nữa để kiểm tra/bỏ chọn. Làm thế nào trên trái đất để bạn tắt điều này, tôi đã tìm kiếm cách để lâu để tìm câu trả lời cho điều này. DataGrid có các thuộc tính SelectionMode và SelectionUnit - cả hai đều không chấp nhận 'none' hoặc 'away away'

Bất kỳ trợ giúp nào được đánh giá cao! Mã của tôi bên dưới để tham khảo

<my:DataGrid Margin="15" Name="dgPreview" 
     AutoGenerateColumns="False" CanUserSortColumns="True" 
      CanUserDeleteRows="True" 
      Background="White" 
      ColumnHeaderHeight="20" 
      VerticalScrollBarVisibility="Visible" 
      RowDetailsVisibilityMode="Visible" 
      > 

    <my:DataGrid.Columns> 
     <my:DataGridCheckBoxColumn MinWidth="50" Width="Auto" Header="Include" Binding="{Binding Include}" /> 
     <my:DataGridTextColumn MinWidth="50" Width="Auto" Header="Override #" Binding="{Binding OverrideNumber}" /> 
     <my:DataGridTextColumn MinWidth="220" Width="*" Header="Name" Binding="{Binding Name}" /> 
     <my:DataGridTextColumn MinWidth="50" Width="Auto" IsReadOnly="True" Header="Preview" Binding="{Binding Preview}" /> 
    </my:DataGrid.Columns> 
</my:DataGrid> 
+0

Câu hỏi mới hơn về chủ đề này, với nhiều câu trả lời hay: http://stackoverflow.com/questions/3833536/how-to-perform-single-click-checkbox-selection-in-wpf-datagrid/8333704#8333704 – surfen

Trả lời

19

Lần nhấp đầu tiên đặt ô ở chế độ chỉnh sửa, sau đó lần nhấp thứ hai cho phép bạn sửa đổi hộp kiểm. Bạn có thể thay đổi hành vi này bằng cách sử dụng một DataGridTemplateColumn thay vì một DataGridCheckBoxColumn. Thay DataGridCheckBoxColumn của bạn với điều này:

<my:DataGridTemplateColumn MinWidth="50" Width="Auto" Header="Include" SortMemberPath="Include"> 
    <my:DataGridTemplateColumn.CellTemplate> 
     <DataTemplate> 
     <CheckBox Style="{StaticResource DataGridCheckBoxStyle}" IsChecked="{Binding Path=Include}" /> 
     </DataTemplate> 
    </my:DataGridTemplateColumn.CellTemplate> 
</my:DataGridTemplateColumn> 

DataGridCheckBoxStyle chỉ làm cho CheckBox nhìn một chút đẹp hơn trong DataGrid:

<Style x:Key="DataGridCheckBoxStyle" TargetType="CheckBox" BasedOn="{StaticResource {x:Type CheckBox}}"> 
    <Setter Property="VerticalAlignment" Value="Center" /> 
    <Setter Property="Margin" Value="8,0,3,0" /> 
</Style> 
+0

tuyệt vời, cảm ơn đống John! – RodH257

+2

Không hoạt động với tôi trong WPF 4.0. Cảm ơn cho phong cách mặc dù. :) – bugfixr

+0

Làm việc với tôi trong WPF 4.0. Tuy nhiên, tôi nhận được một cảnh báo trong khi biên soạn và trong nhà thiết kế cho "BasedOn" -Tag trong phong cách: 'Tài nguyên" {x: Type CheckBox} "đã không được tìm thấy' Tôi chỉ cần loại bỏ nó và nó stil hoạt động. – OneWorld

1

Trước, tôi biết đây là một câu hỏi khá cũ nhưng tôi vẫn nghĩ rằng tôi d thử và trả lời nó.

Tôi đã gặp vấn đề tương tự cách đây vài ngày và gặp một giải pháp ngắn đáng ngạc nhiên đối với nó (xem this blog). Về cơ bản, tất cả các bạn cần làm là thay đổi định nghĩa DataGridCheckBoxColumn trong XAML của bạn như sau:

<DataGridTemplateColumn Header="MyCheckBoxColumnHeader"> 
    <DataGridTemplateColumn.CellTemplate> 
     <DataTemplate> 
      <CheckBox HorizontalAlignment="Center" VerticalAlignment="Center" IsChecked="{Binding Path=MyViewModelProperty, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" /> 
     </DataTemplate> 
    </DataGridTemplateColumn.CellTemplate> 
</DataGridTemplateColumn> 

Mặt tích cực của giải pháp này là rõ ràng - đó là XAML chỉ; do đó, nó có hiệu quả ngăn cản bạn khỏi gánh nặng code-back của bạn với logic UI bổ sung và giúp bạn duy trì trạng thái của mình trong con mắt của các zealot MVVM;).

+0

Câu trả lời giống như câu trả lời ở trên. – BenjaminPaul

+0

Cảm ơn câu trả lời này. Ở trên không làm việc cho tôi theo nghĩa là việc nhấp vào một hộp kiểm không thực sự thay đổi các đối tượng bên dưới. Tôi tin rằng thực tế là bạn đã thêm vào Mode = TwoWay đã khắc phục vấn đề đó. – muaddib

Các vấn đề liên quan