2011-04-27 3 views
9

의 행을 더블 클릭 나는 다음과 같이 선택 목록으로 사용하기위한되는 WPF UserControl을 개발했다 :에 명령을 바인딩하는 방법을 데이터 그리드

  • 데이터 그리드를 개체의 CollectionView에 바인딩 (예 : 직원)
  • DataGrid 위에 표시된 TextBox는 DataGrid에 표시된 항목을 필터링하는 데 사용할 수 있습니다.

사용자가 DataGrid에서 행을 두 번 클릭 할 때 실행될 명령을 표시하려고합니다. 그런 다음 컨테이너는 DataGrid에서 SelectedItem을 사용하여 작업을 수행 할 수 있습니다.

지금까지 내가 처리하려 한 두 번 클릭하여 다음과 같이

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

을 더블 클릭 이벤트가 여전히 데이터 그리드의 헤더에 때 사용자가 클릭을 발사하지만. 더블 클릭이 DataGrid의 본문에있을 때만 Command가 실행되도록 제한 할 수 있어야합니다. 이 작업을 수행하는 선언적 방법이 있습니까?

UPDATE

난 그냥 WPF와 MVVM와 그립군요, 정말이 같은 낮은 수준의 재사용 가능한 구성 요소를 구현하는 방법에 대한 지침을 찾고 있어요. 어떤 일반적인 조언도 기꺼이 받아들이고 upvoted 것입니다. 데이터 격자의 selectedItem가

  • 노출 RoutedEvent "ItemDoubleClick"또는 유사한 바인딩 된 종속성 속성 "의 selectedItem을"노출

    • : 약자로, 나는이 UserControl을을 원할 것입니다 있으리라 믿고있어 사용자가 행을 두 번 클릭하면 시작됩니다.

    • ICommandSource을 구현하고 행 더블 클릭 이벤트 처리기에서 CommandHelpers.ExecuteCommandSource(this)을 호출하십시오.

  • 답변

    10

    코드 뒤에 문제가없는 경우 :

    <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 })); 
    } 
    
    +0

    +1 감사합니다. 이것은 정확하게 달성하고 싶은 것이지만, 선언적 방법이 있는지 궁금합니다. – Joe

    +0

    쉬운 방법이 있는지 의심 스럽습니다. [Blend SDK] (http://www.microsoft.com/downloads/en/details.aspx?FamilyID=f1ae9a30-4928-411d-970b-e682ab179e17&displaylang=en)의 'Interactivity (상호 작용)'을 사용하여 이벤트를 명령에 파이프 할 수 있으며 'EventToCommandAction', 문제는 인터랙티비티를 스타일로 사용하는 것은 ** 매우 복잡합니다 **하지만 문제가 없다면 [방법이 있습니다] (http://stackoverflow.com/questions/1647815/how- add-a-style-set-behavior-in-a-style-setter/4779168 # 4779168). –

    +0

    @HB MVVM을 사용하고 KISS를 사용하고 싶습니다. 이제 코드 비하인드 솔루션을 찾아 보겠습니다.솔루션에 대한 한 가지 언급 - 아마도 DataGrid에 추가 될 때마다 모든 행에 MouseBinding을 만들 것입니다. 행 수가 많으면이 방법이 약간 비효율적 일 수 있습니까? 코드 비하인드 길을가는 경우, DataGrid.MouseDoubleClick 이벤트를 처리하고, 행에 있는지 확인한 다음, 명령을 실행하는 것이 더 효율적인지 궁금합니다. – Joe

    0

    당신은 단순히 그리드에 데이터 그리드를 넣어 그리드에있는 InputBindings을 정의 할 수 있습니다. canExecute 정의에서 행이 선택되어 있는지 확인해야합니다. 그것은 KeyBinding뿐만 아니라, 예를 들어 커스텀 Delete-Command와 같이 작동합니다.

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

    추가 후 내 응용 프로그램이 정지합니다. –

    +0

    이 문제는 행 자체가 아니라 행이 선택되면 명령을 트리거하기 위해 그리드의 아무 곳이나 두 번 클릭 할 수 있다는 것입니다. –

    관련 문제