Как связать команду, чтобы дважды щелкнуть строку в DataGrid - PullRequest
9 голосов
/ 27 апреля 2011

Я разработал WPF UserControl, который предназначен для использования в качестве списка выбора следующим образом:

  • DataGrid, привязанный к CollectionView объектов (например, Employees)
  • TextBox над DataGrid, который можно использовать для фильтрации элементов, отображаемых в DataGrid.

Я хочу предоставить команду, которая будет выполнена, когда пользователь дважды щелкнет строку в DataGrid.Затем контейнер может реагировать на это, делая что-то с SelectedItem в DataGrid.

До сих пор я пытался обработать двойной щелчок следующим образом:

<DataGrid IsReadOnly="True">
    <DataGrid.InputBindings>
        <MouseBinding MouseAction="LeftDoubleClick" Command="... />
    </DataGrid.InputBindings>
...

Однако двойнойСобытие -click по-прежнему срабатывает, когда пользователь щелкает в заголовке DataGrid.Я хотел бы иметь возможность ограничить его так, чтобы команда выполнялась только тогда, когда двойной щелчок находится в теле DataGrid.Есть ли декларативный способ сделать это?

ОБНОВЛЕНИЕ

Я только начинаю разбираться с WPF и MVVM и действительно ищу руководство о том, как реализоватьмногоразовые компоненты низкого уровня, подобные этому.Любые общие советы также будут с благодарностью приняты и одобрены.В нынешнем виде я предполагаю, что я хочу, чтобы этот UserControl:

  • Предоставлял свойство зависимости "SelectedItem", которое привязано к SelectedItem объекта DataGrid

  • Предоставьте RoutedEvent "ItemDoubleClick" или аналогичный, который запускается, когда пользователь дважды щелкает строку.

  • Реализует ICommandSource и вызывает CommandHelpers.ExecuteCommandSource(this) из строки double-обработчик события click.

Ответы [ 2 ]

10 голосов
/ 27 апреля 2011

Если код не является проблемой:

<DataGrid.RowStyle>
    <Style TargetType="{x:Type DataGridRow}">
        <EventSetter Event="Loaded" Handler="Row_Loaded"/>
    </Style>
</DataGrid.RowStyle>
private void Row_Loaded(object sender, RoutedEventArgs e)
{
    var row = sender as DataGridRow;
    row.InputBindings.Add(new MouseBinding(MyCommands.MyCommand,
            new MouseGesture() { MouseAction = MouseAction.LeftDoubleClick }));
}
1 голос
/ 21 июля 2011

Вы можете просто поместить DataGrid в Grid и определить свои InputBindings в Grid.В определении canExecute вы должны проверить, выбрана ли строка.Это работает и для связывания клавиш, например, пользовательская команда удаления.

<Grid>
        <Grid.InputBindings>
            <MouseBinding MouseAction="LeftDoubleClick" Command="... />
        </Grid.InputBindings>
        <DataGrid IsReadOnly="True">
        ...
</Grid>
...