WPF автоматическое нажатие кнопки первого результата DataGrid после нажатия ENTER в текстовом поле исследования - PullRequest
0 голосов
/ 06 июля 2018

Я работаю над проектом WPF MVVM. DataGrid показывает записи, найденные службой. В каждой строке есть кнопка, которая выполняет действие с выбранной записью.

public class ReferenceDossier
{
}

XAML

<GroupBox>
    <Grid>
        <StackPanel>
            <TextBox>
                <TextBox.InputBindings>
                    <KeyBinding Key="Enter" Command="{Binding SearchCommand}"/>
                </TextBox.InputBindings>
            </TextBox>
        </StackPanel>
    </Grid>
</GroupBox>

<GroupBox>
    <Grid>
        <StackPanel>
            <DataGrid ItemsSource="{Binding ReferenceDossiers}">
                <DataGrid.Columns>
                    <DataGridTemplateColumn>
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <Button Command="{Binding Command}"
                                                CommandParameter="{Binding}">>
                                    <iconPacks:PackIconFontAwesome Kind="PlusCircle" Foreground="#FF94bf00"/>
                                </Button>
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                    </DataGridTemplateColumn>
                </DataGrid.Columns>
            </DataGrid>
        </StackPanel>
    </Grid>
</GroupBox>

Когда я выполняю поиск по ключевому слову в TextBox и нажимаю Enter, он выполняет расчет и показывает результаты в DataGrid.

Что я хочу закодировать:

Если пользователь снова нажимает ENTER (после записи, показанной на DataGrid), и пользователь еще не выбрал строку, Command из Button первой строки должен быть вызван, не важно, сколько записей в сетке, первый должен быть выбран.

Если пользователь выбирает строку в DataGrid и нажимает ENTER, вызывается Command из Button этой строки.

Если запись нулевая, ничего не делать.

Цель - сократить время выбора в графическом интерфейсе.

Но я не могу найти способ сделать это с помощью подхода MVVM.

При некоторых попытках, когда я нажимаю клавишу ВВОД после нажатия ключевого слова, TextBox всегда фокусируется. Я снова нажимаю ENTER, он повторяет расчет.

Ответы [ 2 ]

0 голосов
/ 10 июля 2018

Решение найдено:

После этого ответа мы можем установить фокус для управления с помощью пользовательского свойства IsFocused.

Итак, я поместил это свойство в кнопку, установил значение true для свойства, если это первая строка, и связал Enter InputBinding

public class ReferenceDossier : INotifyPropertyChanged
    {
        private bool _selected;
        public bool Selected
        {
            get
            {
                return _selected;
            }
            set
            {
                _selected = value;
                RaisePropertyChanged("Selected");
            }
        }
}

Установите Selected для первой записи, чтобы фокусировать кнопку первого ряда.

if(ReferenceDossiers.FirstOrDefault() != null)
                    ReferenceDossiers.First().Selected = true;

XAML

                     <DataGridTemplateColumn>
                            <DataGridTemplateColumn.CellStyle>
                                <Style TargetType="DataGridCell">
                                    <Setter Property="IsTabStop" Value="False" />
                                    <Setter Property="BorderThickness" Value="0"/>                                        
                                </Style>
                            </DataGridTemplateColumn.CellStyle>
                            <DataGridTemplateColumn.CellTemplate>
                                <DataTemplate>
                                    <Button behaviors:FocusExtension.IsFocused="{Binding Selected}"
                                         Command="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type controls:MetroWindow}}, Path=DataContext.AddCommand}"
                                            CommandParameter="{Binding}">
                                        <Button.InputBindings>
                                            <KeyBinding Key="Enter" Command="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type controls:MetroWindow}}, Path=DataContext.AddCommand}"
                                            CommandParameter="{Binding}"/>
                                        </Button.InputBindings>
                                        <iconPacks:PackIconFontAwesome Kind="PlusCircle" Foreground="#FF94bf00"/>
                                    </Button>
                                </DataTemplate>
                            </DataGridTemplateColumn.CellTemplate>
                        </DataGridTemplateColumn>

Чтобы выбрать кнопку другого ряда нажатием вверх / вниз, мы должны настроить ячейку, если нет, CellTemplate фокусируется не на кнопку, и нажатие ENTER не работает.

0 голосов
/ 06 июля 2018

Вы можете использовать EventTrigger для достижения этой цели.

XAML

<Style TargetType="DataGridRow">
    <Style.Triggers>
        <local:EnterDownEventTrigger EventName="KeyDown">
            <i:InvokeCommandAction Command="{Binding Command}" CommandParameter="{Binding}"/>
        </local:EnterDownEventTrigger>
    </Style.Triggers>
</Style>

Поскольку вы хотите, чтобы Command вызывался только при нажатии Enter , для этого нужно написать пользовательский EventTrigger.

Пользовательский триггер события для клавиши ввода

using System.Windows.Interactivity;
public class EnterDownEventTrigger : EventTrigger 
{    
    public EnterDownEventTrigger() : base("KeyDown") { }

    protected override void OnEvent(EventArgs eventArgs) 
    {
        var e = eventArgs as KeyEventArgs;
        if (e != null && e.Key == Key.Enter)
            this.InvokeActions(eventArgs);
    }
}

Ссылка на сборку: System.Windows.Interactivity.dll

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...