Please help me, I am writing application with "WPF Application Framework" and EF Code First. I'm trying set selected row to ViewModels variable "SelectedRawMaterial" which is binded to DataGrids SelectedItem and it raises an exception : "The current value of the SelectionUnit property on the parent DataGrid prevents rows from being selected."
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));
}
}
}
In this place it raises exception.
ViewModel.SelectedRawMaterial = rm;
DataGrids code
<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>
I added SelectionUnit="Cell" because also I want to handle CellKeyDown.