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