如何在双击WPF数据网格时更改单个单元格的值

本文关键字:单个 单元格 网格 双击 WPF 数据网 数据 | 更新日期: 2023-09-27 18:02:56

我有一个数据网格,它列出了一对夫妇的状态,并显示"真"或"假"。当我双击一个单元格时,我想切换该单元格显示的内容。我已经尝试使用一些属性为我的数据网格,如currentItem, SelectedItem, SelectedValue,和SelectedUnit,但这些都没有工作。

<DataGrid x:Name="dataGrid1" IsReadOnly="True" IsManipulationEnabled="False" Width="250" Height="468"  Margin="795,15,18,15" 
          VerticalAlignment="Top" AutoGenerateColumns="False" CanUserAddRows="False" MouseDoubleClick="DoubleClick" 
          ItemsSource="{Binding Availability}">
    <DataGrid.Columns>
        <DataGridTextColumn Header="Number" Binding="{Binding Key, UpdateSourceTrigger=PropertyChanged}" Width="Auto"/>
        <DataGridTextColumn Header="Status1" Binding="{Binding Value1, UpdateSourceTrigger=PropertyChanged}" Width="Auto"/>
        <DataGridTextColumn Header="Status2" Binding="{Binding Value2, UpdateSourceTrigger=PropertyChanged}" Width="*"/>
    </DataGrid.Columns>
</DataGrid>

下面是我的codebehind中的事件:

private void DoubleClick(object sender, MouseButtonEventArgs e)
{
    if (dataGrid1.SelectedItem == null) return;
    if (dataGrid1.CurrentItem == "True" )
    {
        dataGrid1.CurrentItem = "False";
    }
    else if (dataGrid1.CurrentItem == "False")
    {
        dataGrid1.CurrentItem = "True";
    }
}

如何在双击WPF数据网格时更改单个单元格的值

如果你想知道哪个DataGridCell被双击了,你必须把它添加到你的XAML:

<DataGrid.CellStyle>
    <Style TargetType="DataGridCell">
        <EventSetter Event="MouseDoubleClick" Handler="dataGrid1_CellDoubleClick" />
    </Style>
</DataGrid.CellStyle>

然后在代码后面处理事件:

private void dataGrid1_CellDoubleClick(object sender, RoutedEventArgs e)
{
    var cell = sender as DataGridCell;
    // Do stuff with your cell
}

问题是……您的DataGrid和列是绑定的,因此您对单元格内容所做的大多数操作将不会反映在实际数据中。

我说"most",因为事实上,您可以同时更改单元格文本和数据绑定属性的值…但是它很脏,不属于视图。

private void dataGrid1_CellDoubleClick(object sender, RoutedEventArgs e)
{
    var cell = sender as DataGridCell;
    if (cell != null && cell.Content is TextBlock)
    {
        var textBlock = cell.Content as TextBlock;
        textBlock.SetCurrentValue(TextBlock.TextProperty, "put your text here");
        var binding = BindingOperations.GetBindingExpression(textBlock, TextBlock.TextProperty);
        binding.UpdateSource();
    }
}

为此工作,你必须设置Mode=TwoWay上你的DataGridTextColumn绑定(虽然它可能已经是默认模式,我不记得了)。另外,它不能用于其他类型的列。

但是…正如我所说的,这个解决方案是肮脏的,你希望在你的视图模型中有这种逻辑。

要做到这一点,最简单的方法可能是从视图模型中公开一个方法,您可以从代码中调用该方法,传递一些参数,如行数据项和列的属性名。
private void dataGrid1_CellDoubleClick(object sender, RoutedEventArgs e)
{
    var cell = sender as DataGridCell;
    if (cell != null)
    {
        (this.DataContext as MyViewModel).DoStuff(cell.DataContext, cell.Column.SortMemberPath);
    }
}