如何在双击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";
}
}
如果你想知道哪个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);
}
}