WPF Datagrid выполняет действие при выборе строки с данными, связанными с этой строкой - PullRequest
0 голосов
/ 27 июня 2019

Получил список объектов, которые в данный момент отображаются через сетку данных. Что мне нужно сделать, так это когда пользователь дважды щелкает указанную строку, он открывает другое окно, которое представляет собой модель, показывающую данные, связанные с объектом строки, которая выбрана в данный момент. Я не могу понять, как а) определить, когда пользователь дважды щелкнул, и б) как узнать, в какой строке пользователь дважды щелкнул.

XAML:

    <DataGrid x:Name="BlueprintsDataGrid" Grid.Row="0" IsReadOnly="True" 
              ItemsSource="{Binding Path=Game.Blueprints, ElementName=uc}" 
              AutoGenerateColumns="False">
        <DataGrid.Columns>
            <DataGridTextColumn Header="Name" Width="80*" Binding="{Binding Name}"/>
            <DataGridTextColumn Header="ME" Width="30*" Binding="{Binding MaterialEfficiency}"
                                HeaderStyle="{StaticResource HeaderRightJustify}"
                                CellStyle="{StaticResource ColumnRight}"/>
            <DataGridCheckBoxColumn Header="BPO" Width="30*" Binding="{Binding IsOrginial}"
                                    HeaderStyle="{StaticResource HeaderRightJustify}"/>
        </DataGrid.Columns>
    </DataGrid>

Ответы [ 2 ]

2 голосов
/ 27 июня 2019

Вы можете сделать что-то вроде следующего:

<DataGrid x:Name="BlueprintsDataGrid" Grid.Row="0" IsReadOnly="True" 
              ItemsSource="{Binding Path=Game.Blueprints, ElementName=uc}" 
              SelectedItem="{Binding CurrentSelection}"
              AutoGenerateColumns="False">
        <DataGrid.Columns>
            <DataGridTextColumn Header="Name" Width="80*" Binding="{Binding Name}"/>
            <DataGridTextColumn Header="ME" Width="30*" Binding="{Binding MaterialEfficiency}"
                                HeaderStyle="{StaticResource HeaderRightJustify}"
                                CellStyle="{StaticResource ColumnRight}"/>
            <DataGridCheckBoxColumn Header="BPO" Width="30*" Binding="{Binding IsOrginial}"
                                    HeaderStyle="{StaticResource HeaderRightJustify}"/>
        </DataGrid.Columns>
    </DataGrid>

Примечание: CurrentSelection должно существовать в вашем классе ViewModel.Это свойство должно реализовывать интерфейс INotifyPropertyChanged и должно быть типом объекта, который удерживается вашим ItemsSource !

Для распознавания двойного щелчка мыши вы можете расширить приведенный выше xaml на что-то вроде

 <DataGrid x:Name="BlueprintsDataGrid" Grid.Row="0" IsReadOnly="True" 
              ItemsSource="{Binding Path=Game.Blueprints, ElementName=uc}" 
              SelectedItem="{Binding CurrentSelection}"
              AutoGenerateColumns="False">
 <i:Interaction.Triggers>
            <i:EventTrigger EventName="MouseDoubleClick">
                <i:InvokeCommandAction Command="{Binding DoubleClickedCommand}"/>
            </i:EventTrigger>
        </i:Interaction.Triggers>
        <DataGrid.Columns>
            <DataGridTextColumn Header="Name" Width="80*" Binding="{Binding Name}"/>
            <DataGridTextColumn Header="ME" Width="30*" Binding="{Binding MaterialEfficiency}"
                                HeaderStyle="{StaticResource HeaderRightJustify}"
                                CellStyle="{StaticResource ColumnRight}"/>
            <DataGridCheckBoxColumn Header="BPO" Width="30*" Binding="{Binding IsOrginial}"
                                    HeaderStyle="{StaticResource HeaderRightJustify}"/>
        </DataGrid.Columns>
    </DataGrid>

Примечание: Поэтому вам необходимо свойство DoubleClickedCommand типа ICommand в вашей ViewModel.Там вы можете проверить свой CurrentSelection.

public ICommand DoubleClickedCommand { get; set; }

В вашем конструкторе ViewModel:

DoubleClickedCommand = new RelayCommand(DoubleClick);

И сам метод:

private void DoubleClick()
{
    if(CurrentSelection == null) { return; }
    // Do stuff in here            
}
0 голосов
/ 28 июня 2019

Вы можете обработать событие MouseDoubleClick и привести DataContext источника события:

private void OnMouseDoubleClick(object sender, MouseButtonEventArgs e)
{
    var fe = e.OriginalSource as FrameworkElement;
    if (fe != null)
    {
        var blueprint = fe.DataContext as BluePrint;
        if (blueprint != null)
        {
            //open window...
        }
    }
}

XAML:

<DataGrid x:Name="BlueprintsDataGrid" Grid.Row="0" IsReadOnly="True" 
          ItemsSource="{Binding Path=Game.Blueprints, ElementName=uc}" 
          AutoGenerateColumns="False"
          MouseDoubleClick="Dgm_MouseDoubleClick">
    <DataGrid.Columns>
        <DataGridTextColumn Header="Name" Width="80*" Binding="{Binding Name}"/>
        <DataGridTextColumn Header="ME" Width="30*" Binding="{Binding MaterialEfficiency}"
                            HeaderStyle="{StaticResource HeaderRightJustify}"
                            CellStyle="{StaticResource ColumnRight}"/>
        <DataGridCheckBoxColumn Header="BPO" Width="30*" Binding="{Binding IsOrginial}"
                                HeaderStyle="{StaticResource HeaderRightJustify}"/>
    </DataGrid.Columns>
</DataGrid>

Измените BluePrint на любое имя вашего класса.

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