source

WPF 데이터 그리드 선택 행 클릭 이벤트?

manycodes 2023. 5. 1. 21:33
반응형

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그리고.MouseDoubleClickDarlan 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

반응형