请帮助我,我正在用“WPF Application Framework”和EF Code First编写应用程序。我正在尝试将选定行设置为ViewModels变量“SelectedRawMaterial”,该变量绑定到DataGrids SelectedItem并引发异常:“父DataGrid上SelectionUnit属性的当前值会阻止选择行。”
private void rawMaterialTable_SelectedCellsChanged(object sender, SelectedCellsChangedEventArgs e)
{
DataGridCell cell = null;
try
{
cell = DataGridHelper.GetCell(rawMaterialTable.SelectedCells[0]);
}
catch (Exception)
{ }
if (cell != null)
{
int i = DataGridHelper.GetRowIndex(cell);
try
{
RawMaterial rm = (RawMaterial)rawMaterialTable.Items[i];
ViewModel.SelectedRawMaterial = rm;
}
catch (Exception) { }
}
}
public static class DataGridHelper
{
public static DataGridCell GetCell(DataGridCellInfo dataGridCellInfo)
{
if (!dataGridCellInfo.IsValid)
{
return null;
}
var cellContent = dataGridCellInfo.Column.GetCellContent(dataGridCellInfo.Item);
if (cellContent != null)
{
return (DataGridCell)cellContent.Parent;
}
else
{
return null;
}
}
public static int GetRowIndex(DataGridCell dataGridCell)
{
// Use reflection to get DataGridCell.RowDataItem property value.
PropertyInfo rowDataItemProperty = dataGridCell.GetType().GetProperty("RowDataItem",
BindingFlags.Instance |
BindingFlags.NonPublic);
DataGrid dataGrid = GetDataGridFromChild(dataGridCell);
return dataGrid.Items.IndexOf(rowDataItemProperty.GetValue(dataGridCell, null));
}
public static DataGrid GetDataGridFromChild(DependencyObject dataGridPart)
{
if (VisualTreeHelper.GetParent(dataGridPart) == null)
{
throw new NullReferenceException("Control is null.");
}
if (VisualTreeHelper.GetParent(dataGridPart) is DataGrid)
{
return (DataGrid)VisualTreeHelper.GetParent(dataGridPart);
}
else
{
return GetDataGridFromChild(VisualTreeHelper.GetParent(dataGridPart));
}
}
}
在这个地方它会引发异常。
ViewModel.SelectedRawMaterial = rm;
DataGrids代码
<DataGrid x:Name="rawMaterialTable" ItemsSource="{Binding RawMaterials}" SelectedItem="{Binding SelectedRawMaterial}"
CanUserDeleteRows="False" BorderThickness="0" SelectionMode="Single" SelectionUnit="Cell" IsReadOnly="false"
Grid.Row="1" Grid.Column="1" Margin="1,1,1,1" PreviewKeyDown="rawMaterialTable_PreviewKeyDown" SelectedCellsChanged="rawMaterialTable_SelectedCellsChanged" >
<DataGrid.InputBindings>
<KeyBinding Command="{Binding RemoveCommand}" Key="Del"/>
<KeyBinding Command="{Binding AddCommand}" Key="Insert"/>
<KeyBinding Command="{Binding EditCommand}" Key="F3"/>
</DataGrid.InputBindings>
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding Code, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True,
ValidatesOnExceptions=True, NotifyOnValidationError=True}"
Header="{x:Static p:Resources.Code}" Width="60" ElementStyle="{StaticResource TextCellElementStyle}"
EditingElementStyle="{StaticResource TextCellEditingStyle}" DisplayIndex="0"/>
</DataGrid.Columns>
</DataGrid>
我添加了SelectionUnit =“Cell”,因为我也想处理CellKeyDown。
答案 0 :(得分:7)
这是因为您将数据网格的SelectionUnit
(see the definition of the property)属性设置为Cell
,我相信您一次尝试选择一行。
已修改:如果您将SelectionUnit
更改为CellOrRowHeader
以允许单元格选择,但绑定选择整行