私を助けてください、私は「WPF Application Framework」とEF Code Firstでアプリケーションを書いています。選択した行を、DataGrids SelectedItem にバインドされている ViewModels 変数 "SelectedRawMaterial" に設定しようとすると、例外が発生します: "親 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;
DataGrid コード
<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>
CellKeyDown も処理したいので、SelectionUnit="Cell" を追加しました。