2015-05-24 3 views
2

Я пытаюсь добавить столбец флажка в мой datagrid, чтобы пользователи могли легко видеть, что выбрано и легко выбрать несколько столбцов, не зная, как с помощью клавиши CTRL. Будет ли кто-то помогать?Как я могу установить флажок для работы в WPF datagrid

Флажок будет отменен, если он уже выбран, но я не могу его проверить, когда я нажимаю на него.

<Window.Resources> 
     <DataTemplate x:Key="isSelectedCheckBoxColumn"> 
       <CheckBox IsChecked="{Binding Path=IsSelected, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, 
     RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGridRow}}}"> 
        <CheckBox.LayoutTransform> 
         <ScaleTransform ScaleX="1.5" ScaleY="1.5" /> 
        </CheckBox.LayoutTransform> 
       </CheckBox> 
     </DataTemplate> 
     <Style x:Key="RowStyleWithAlternation" TargetType="DataGridRow"> 
      <Setter Property="SnapsToDevicePixels" Value="True" /> 
      <Setter Property="Background" Value="GhostWhite"/> 
      <Setter Property="FontWeight" Value="Normal"/> 
      <Setter Property="ContextMenu" Value="{x:Null}"/> 
      <Style.Triggers> 
       <Trigger Property="AlternationIndex" Value="1"> 
        <Setter Property="Background" Value="#C1FFC1"/> 
       </Trigger> 
       <Trigger Property="IsMouseOver" Value="True"> 
        <Setter Property="Background" Value="#F9F99F"/> 
       </Trigger> 
       <Trigger Property="IsSelected" Value="True"> 
        <Setter Property="Background" Value="LightBlue" /> 
       </Trigger> 
       <Trigger Property="Validation.HasError" Value="True" > 
        <Setter Property="Effect"> 
         <Setter.Value> 
          <DropShadowEffect Color="Red" ShadowDepth="0" BlurRadius="20" /> 
         </Setter.Value> 
        </Setter> 
        <Setter Property="BorderThickness" Value="2" /> 
        <Setter Property="BorderBrush" Value="Red" /> 
        <Setter Property="Foreground" Value="Blue" /> 
        <Setter Property="FontSize" Value="12" /> 
       </Trigger> 
      </Style.Triggers> 
     </Style> 

     <Style x:Key="CenterCellStyle" TargetType="{x:Type DataGridCell}"> 
       <Setter Property="Template"> 
      <Setter.Value> 
        <ControlTemplate TargetType="{x:Type DataGridCell}"> 
         <Grid> 
         <ContentPresenter HorizontalAlignment="center"/> 
        </Grid> 
       </ControlTemplate> 
      </Setter.Value> 
      </Setter> 
     </Style> 

     <Style x:Key="RightCellStyle" TargetType="{x:Type DataGridCell}"> 
       <Setter Property="Template"> 
      <Setter.Value> 
        <ControlTemplate TargetType="{x:Type DataGridCell}"> 
         <Grid> 
         <ContentPresenter HorizontalAlignment="Right"/> 
        </Grid> 
       </ControlTemplate> 
      </Setter.Value> 
      </Setter> 
     </Style> 
    </Window.Resources> 


       <DataGrid Grid.Row="1" AutoGenerateColumns="False" Name="grid_achCredit" RowStyle="{StaticResource RowStyleWithAlternation}" AlternationCount="2" FontSize="15" CanUserAddRows="False" CanUserDeleteRows="False" IsReadOnly="False" SelectionMode="Extended"> 
        <DataGrid.Columns> 
         <DataGridTemplateColumn Header="" CellTemplate="{StaticResource isSelectedCheckBoxColumn}" IsReadOnly="False"/> 
         <DataGridTextColumn Header="ID" Width="Auto" IsReadOnly="False" Binding="{Binding ID}" /> 
         <DataGridTextColumn Header="TransDate" Width="Auto" IsReadOnly="False" Binding="{Binding transactionDate, StringFormat=\{0:MM-dd-yyyy\}}" /> 
         <DataGridTextColumn Header="Payor" Width="Auto" IsReadOnly="False" Binding="{Binding payer}" /> 
         <DataGridTextColumn Header="Description" Width="*" IsReadOnly="False" Binding="{Binding description}" /> 
         <DataGridTextColumn Header="Amount" Width="Auto" IsReadOnly="False" Binding="{Binding amount, StringFormat=C}" /> 
         <DataGridTextColumn Header="Balance" Width="Auto" IsReadOnly="False" Binding="{Binding amount, StringFormat=C}" /> 
         <DataGridTextColumn Header="Selected By" Width="*" IsReadOnly="False" Binding="{Binding lockedUser}"/> 
        </DataGrid.Columns> 
       </DataGrid> 

ответ

1

Проблема заключается в том, когда вы нажимаете CheckBox это в то же времяIsChecked собственности и IsSelected свойство тока DataGridRow набор для true. Поэтому привязка IsChecked не работает должным образом.

Один из способов избежать этого (возможно, не самый лучший) - это предотвратить отметку CheckBox, щелкнув (только снять отметку с разрешения). Это может быть достигнуто путем принятия CheckBox включен только тогда, когда это проверено:

 <CheckBox IsEnabled="{Binding RelativeSource={RelativeSource Self}, Path=IsChecked}" 
        IsChecked="{Binding Path=IsSelected, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, 
        RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGridRow}}}"> 

Таким образом, это означает, что ваш CheckBox получает проверяется только тогда, когда получает выбран соответствующий ряд, но может получить бесконтрольно вручную.

+0

К сожалению, это не позволяет пользователям выбирать несколько строк с помощью флажков. Но ты помог мне. Я отправил ответ на решение, которое я использовал. – donL

1

В итоге я решил использовать ярлыки, чтобы установить флажок. Вот код, который я добавил в свой datagrid

    <DataGrid.RowHeaderTemplate> 
         <DataTemplate> 
          <Grid> 
           <CheckBox IsChecked="{Binding Path=IsSelected, Mode=TwoWay, 
             RelativeSource={RelativeSource FindAncestor, 
             AncestorType={x:Type DataGridRow}}}" Margin="0,-3,0,0"> 
            <CheckBox.LayoutTransform> 
             <ScaleTransform ScaleX="2" ScaleY="2" /> 
            </CheckBox.LayoutTransform> 
           </CheckBox> 
          </Grid> 
         </DataTemplate> 
        </DataGrid.RowHeaderTemplate> 
+0

хм, это похоже на лучшее решение, поскольку оно чище и поддерживает многоэкранный выбор :) –

Смежные вопросы