Я использую WPF Datagrid и переопределил OnSelectionChange для поддержки множественного выбора из пользовательского интерфейса, а также из кода.
Прямо сейчас, если я нажимаю клавишу со стрелкой вниз на любом выбранном элементе, выделение и фокус перемещаются к следующему строка. Я хочу, чтобы двигался только фокус, а не выбор. Я хочу выбрать элемент в фокусе, когда нажата клавиша пробела или клавиша выхода, а не клавиша со стрелкой вверх / вниз. Как добиться такого поведения. Вот мой код -
<Controls:DMDataGrid Grid.Row="2" x:Name="dgrObjects"
ItemsSource="{Binding ListOfObjects, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"
ScrollViewer.CanContentScroll="True"
ScrollViewer.HorizontalScrollBarVisibility="Visible" AutoGenerateColumns="False"
ScrollViewer.VerticalScrollBarVisibility="Visible" GridLinesVisibility="None"
CanUserAddRows="false" Background="White"
IsReadOnly="True" HeadersVisibility="Column"
DMItemsList="{Binding SelectedObjects, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
SelectionMode="Extended" SelectionUnit="FullRow" CanUserReorderColumns="True"
CanUserSortColumns="True" Focusable="True">
<Controls:DMDataGrid.Resources>
<Style TargetType="DataGridRow">
<Setter Property="IsSelected" Value="{Binding IsObjectSelected, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"/>
</Style>
</Controls:DMDataGrid.Resources>
Вот код для поведения изменения выбора -
public class DMDataGrid : DataGrid
{
public DMDataGrid()
{
SelectionChanged += DMDataGrid_SelectionChanged;
}
void DMDataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (e.AddedItems != null)
{
foreach (var item in e.AddedItems)
{
if (item.GetType() == typeof(myclass))
{
(myclass)) tempItem = ((myclass)))item;
if (tempItem.IsSelected)
{
// if bound data item still is selected, fix this
tempItem.IsSelected = true;
}
}
}
}
if (e.RemovedItems != null)
{
foreach (var item in e.RemovedItems)
{
if (item.GetType() == typeof((myclass))))
{
(myclass)) tempItem = ((myclass)))item;
if (tempItem.IsSelected)
{
// if bound data item still is selected, fix this
tempItem.IsSelected = false;
}
}
}
}
e.Handled = true;
DMItemsList = SelectedItems;
}
public ICommand UnselectAllCommand { get { return new RelayCommand<object>((object o) => UnselectAll()); } }
public IList DMItemsList
{
get { return (IList)GetValue(DMItemsListProperty); }
set { SetValue(DMItemsListProperty, value); }
}
private static void OnSelectedItemsListChanged(DependencyObject o, DependencyPropertyChangedEventArgs e)
{
}
public static readonly DependencyProperty DMItemsListProperty = DependencyProperty.Register("DMItemsList", typeof(IList), typeof(DMDataGrid), new PropertyMetadata(OnSelectedItemsListChanged));
}