DataGrid catch значение ячейки изменилось событие с одним щелчком мыши на UpdateSourceTrigger = SourceUpdated

Я изо всех сил пытаюсь поймать событие с DataGrid. Я хочу достичь того, что когда пользователь нажимает один раз на флажок ячейки datagrid, событие срабатывает, и я могу получить текущее значение ячейки. Однако CellChangedEvent срабатывает только при изменении выбора, а CellEditingEvent либо срабатывает, когда ячейка теряет фокус, либо никогда не срабатывает. Он никогда не срабатывает, если я пытаюсь сделать флажок изменяемым одним щелчком мыши, выполнив следующее:

<DataGrid Grid.ColumnSpan="2" Grid.Row="1" Grid.Column="0" AutoGenerateColumns="True" ItemsSource="{Binding MasterDataTable, Mode=TwoWay}" CanUserAddRows="False" Margin="10 5" CurrentCellChanged="DataGrid_CurrentCellChanged">
            <DataGrid.Resources>
                <Style TargetType="DataGridCell">
                    <Style.Triggers>
                        <Trigger Property="IsMouseOver" Value="True">
                            <Setter Property="IsEditing" Value="True" />
                        </Trigger>
                    </Style.Triggers>
                </Style>
            </DataGrid.Resources>
        </DataGrid>

Как я могу вызвать a способ как только пользователь нажимает на флажок внутри клетки? Спасибо заранее.

3 ответов


1) в вашем регистре DataGrid для TargetUpdated событие .

2) указать столбец , расположенный AutoGenerateColumns=False .

3) в вашем флаге привязки NotifyOnTargetUpdated property (ваша цель-ваш флажок).

4) в вашей привязки UpdateSourceTrigger=PropertyChanged и Mode=TwoWay (не поведение DataGrid по умолчанию).

в XAML :

 <DataGrid TargetUpdated="DataGrid_TargetUpdated" 
           AutoGenerateColumns="False" 
           ItemsSource="{Binding SomeValues, Mode=OneWay}"  CanUserAddRows="False"  >
    <DataGrid.Columns>
        <DataGridCheckBoxColumn Binding="{Binding Path=.,  NotifyOnTargetUpdated=True, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" Width="*"/>                        
    </DataGrid.Columns>
</DataGrid>

в CS: (где вы, возможно, не хотите обрабатывать это событие.)

   private void DataGrid_TargetUpdated(object sender, DataTransferEventArgs e)
   {
         // Do what ever...
   }  

вот как я ее решила. Это не лучшее решение, но оно работает для меня. Как указано в @eranotzap, я установил set AutoGenerateColumns=False и UpdateSourceTrigger = PropertyChanged. Затем я сделал следующее:--3-->

<DataGrid Grid.ColumnSpan="2" Grid.Row="1" Grid.Column="0" 
          AutoGenerateColumns="False" 
          ItemsSource="{Binding MasterDataTable, Mode=TwoWay}" 
          CanUserAddRows="False" 
          Margin="10 5">
    <DataGrid.Columns>
        <DataGridTextColumn Binding="{Binding Path=Fornitore}" Header="Fornitore" Width="Auto" IsReadOnly="True" />
        <DataGridTextColumn Binding="{Binding Path=Stat}" Header="Stat" Width="Auto" IsReadOnly="True" />
        <DataGridTextColumn Binding="{Binding Path=Intestazione}" Header="Intestazione" Width="*" IsReadOnly="True" >
        <DataGridTextColumn.ElementStyle>
            <Style TargetType="TextBlock">
                <Setter Property="TextWrapping" Value="Wrap" />
            </Style>
        </DataGridTextColumn.ElementStyle>
        <DataGridTextColumn.EditingElementStyle>
            <Style TargetType="TextBox">
                <Setter Property="TextWrapping" Value="Wrap" />
                <Setter Property="AcceptsReturn" Value="true" />
            </Style>
        </DataGridTextColumn.EditingElementStyle>
        </DataGridTextColumn>
        <DataGridTextColumn Binding="{Binding Path=PrzVend}" Header="PrzVend" Width="Auto" IsReadOnly="True" />
        <DataGridTextColumn Binding="{Binding Path=DatEXPO}" Header="DatEXPO" Width="Auto" IsReadOnly="True" />
        <DataGridCheckBoxColumn Binding="{Binding Path=Sel, NotifyOnSourceUpdated=False, NotifyOnTargetUpdated=True, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" Header="Sel" Width="Auto">
            <DataGridCheckBoxColumn.CellStyle>
                <Style TargetType="DataGridCell">
                    <EventSetter Event="CheckBox.Checked" Handler="CellChanged"/>
                    <EventSetter Event="CheckBox.Unchecked" Handler="CellChanged"/>
                    <Style.Triggers>
                        <MultiTrigger>
                            <MultiTrigger.Conditions>
                                <Condition Property="IsMouseOver" Value="True" />
                                <Condition Property="IsReadOnly" Value="False" />
                            </MultiTrigger.Conditions>
                            <Setter Property="IsEditing" Value="True" />
                        </MultiTrigger>
                    </Style.Triggers>
                </Style> 
            </DataGridCheckBoxColumn.CellStyle>
        </DataGridCheckBoxColumn>
        <DataGridTextColumn Binding="{Binding Path=CodComp}" Header="CodComp" Width="Auto" IsReadOnly="True" />
    </DataGrid.Columns>
</DataGrid>

в коде позади метода CellChanges вызывается каждый раз, когда флажок установлен или снят. Чтобы получить значение, я делаю следующее:

void CellChanged(object sender, RoutedEventArgs e)
{
    if (sender as DataGridCell != null && (sender as DataGridCell).Column != null && (sender as DataGridCell).Column.Header != null)
    {

        bool? isSelected = (e.OriginalSource as ToggleButton).IsChecked;

    }
}

надеюсь, это кому-то поможет.


попробуйте этот простой способ

private void myDataGrid_CellEditEnding(object sender, DataGridCellEditEndingEventArgs e)
    {
        if (e.Column.SortMemberPath.Equals("EndDate"))
        {
            if (((MyObjectInRow)e.Row.Item).DataFine.Equals(EndDate.MinValue))
            {
                ((MyObjectInRow)e.Row.Item).Completed = 1;
            }
            else
            {
                ((MyObjectInRow)e.Row.Item).Completed = 0;
            }


        }
    }