WPF 데이터 그리드 선택 행 클릭 이벤트?
WPF DataGrid의 선택된 행을 더블 클릭할 때 코드를 실행하고 싶습니다.데이터 그리드에 마우스 더블클릭 이벤트가 있고 행 선택 이벤트도 있다는 것을 알고 있지만 "선택한 행 더블클릭" 이벤트가 없습니다...
당신은 어떻게든 이 행사를 포착하는 것이 가능하다고 생각합니까?
에서 이벤트 핸들러를 추가할 수 있습니다.ItemContainerStyle
(행에 적용되는 스타일):
<DataGrid ... >
<DataGrid.ItemContainerStyle>
<Style TargetType="DataGridRow">
<EventSetter Event="MouseDoubleClick" Handler="Row_DoubleClick"/>
</Style>
</DataGrid.ItemContainerStyle>
...
</DataGrid>
그런 다음 핸들러에서 행이 선택되었는지 확인할 수 있습니다.
private void Row_DoubleClick(object sender, MouseButtonEventArgs e)
{
// execute some code
}
해결책을 찾다가 이 질문이 떠올랐는데 나이 탓인지, 나 자신의 구현 때문인지 답이 통하지 않았습니다.어느 쪽이든, 여기 저에게 효과적인 해결책이 있습니다.
마우스 더블클릭 이벤트를 데이터 그리드에 추가합니다.
<DataGrid x:Name="DatagridMovie"
Width="Auto"
CanUserAddRows="False"
CanUserDeleteRows="True"
IsReadOnly="true"
ItemsSource="{Binding}"
MouseDoubleClick="Row_MouseDoubleClick">
그리고 그 방법으로.
private void Row_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
// Ensure row was clicked and not empty space
var row = ItemsControl.ContainerFromElement((DataGrid)sender,
e.OriginalSource as DependencyObject) as DataGridRow;
if ( row == null ) return;
… Stuff();
}
지금까지 저는 그것에 대한 어떤 문제도 눈치채지 못했습니다.다른 사용자가 가지고 있는 문제를 공유하지 않으므로 미리 선택한 행이 있는 헤더나 빈 공간을 두 번 클릭하면 계속 실행됩니다.
데이터 바인딩 및 MVVM을 사용하면 원클릭 이벤트를 수행할 수 있습니다(=선택됨).행 항목)은 다음과 같습니다.
<Datagrid ItemsSource="{Binding YourObservableCollectionProperty}"
SelectedItem="{Binding YourSelectedItemProperty}">
//more...
</Datagrid>
코드 이면:
public partial class YourClass : Window
{
public YourClass()
{
InitializeComponent();
this.DataContext = new YourClassViewModel();
}
}
모델 보기:
public class YourClassViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public virtual void OnPropertyChanged(string propertyName)
{
if (this.PropertyChanged != null)
{
this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
private ObservableCollection<YourModelClass> _yourObservableCollectionProperty;
public ObservableCollection<YourModelClass> YourObservableCollectionProperty
{
get { return _yourObservableCollectionProperty; }
set
{
_yourObservableCollectionProperty = value;
OnPropertyChanged("YourObservableCollectionProperty");
}
}
private YourModelClass _yourSelectedItemProperty;
public YourModelClass YourSelectedItemProperty
{
get { return _yourSelectedItemProperty; }
set
{
_yourSelectedItemProperty = value;
OnPropertyChanged("YourSelectedItemProperty");
}
}
//Constructor
public YourClassViewModel()
{
/*Take your ModelClass instance and ObservableCollection instance here
and play around with them or move them into a method. Normally your
observablecollection is the itemssource of your datagrid and your selecteditem
is your modelclass.*/
}
}
현재 셀이 변경된 이벤트 핸들러를 사용해 볼 수 있습니다. 더블 클릭은 셀이나 전체 행 편집 또는 다른 프로세스를 시작하는 데 사용할 수 있기 때문에 더블 클릭이 아닌 한 번 클릭만으로 작동합니다.
private void datagrid_CurrentCellChanged(object sender, EventArgs e)
{
int selected_index = datagrid.SelectedIndex + 1;
// this is used for debugging and testing.
//MessageBox.Show("The index of the row for the clicked cell is " + selected_index);
}
그ItemContainerStyle
최선의 해결책이 없습니다. 사용할 것을 제안합니다.RowStyle
:
XAML에서:
<DataGrid.RowStyle>
<Style TargetType="DataGridRow">
<EventSetter Event="MouseDoubleClick" Handler="DataGridRow_MouseDoubleClick"/>
</Style>
</DataGrid.RowStyle>
사용자 코드:
private void DataGridRow_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
//your logic here
}
DoubleClick 이벤트가 발생하는 동안 SelectedRow 속성을 가져와 해당 속성으로 작업을 수행하는 것은 어떻습니까?SelectedRow가 null이면 Row가 선택되지 않았음을 의미하므로 그냥 돌아갑니다.
private void Grid_DoubleClick(object sender, RoutedEventArgs e)
{
if(grid.SelectedRow == null)
return; // return if there's no row selected
// do something with the Selected row here
}
사용하다rowstyle
그리고.MouseDoubleClick
Darlan Dieterich가 말한 것처럼 일.
하지만 있을 때는button
또는checkbox
또는 셀에 있는 다른 컨트롤은 이벤트를 처리하지만 이벤트가 행으로 전달되는 것을 방지하지 않고 이상한 동작을 유발합니다.사용하다MouseDown
어쩌면 이런 경우에 더 나을 수도 있습니다.
<DataGrid.RowStyle>
<Style TargetType="DataGridRow">
<EventSetter Event="MouseDown" Handler="DataGridRow_MouseDown"/>
</Style>
</DataGrid.RowStyle>
private void DataGridRow_MouseDown(object sender, MouseButtonEventArgs e)
{
if(e.ClickCount != 2)
{
return;
}
// code here
e.Handled = true;
}
언급URL : https://stackoverflow.com/questions/3120616/wpf-datagrid-selected-row-clicked-event
'source' 카테고리의 다른 글
자동 크기 조정 기능을 유지하여 WPF에서 텍스트를 회전하는 방법 (0) | 2023.05.01 |
---|---|
깃 상위 포인터를 다른 상위 포인터로 설정 (0) | 2023.05.01 |
MongoDB: 끔찍한 맵성능 저하 (0) | 2023.05.01 |
WPF 콤보 상자 디스플레이 구성원 경로 (0) | 2023.05.01 |
IIS 7.5의 ASP.NET MVC - 오류 403.14 금지 (0) | 2023.05.01 |