2017-10-24 15 views
1

Visual Studio 2008 및 NET Framework 3.5 SP1에 MVVM WPF 앱이 있습니다. 다른 컨트롤 중에서도이 응용 프로그램에는 DataGrid와 버튼이 있습니다.WPF MVVM : 버튼 클릭시 Datagrid에서 현재 선택된 항목으로 포커스 설정

버튼는 : 버튼을 나는 키보드의 위/아래 화살표 키를 클릭하면 그래서 클릭하면

<Button Grid.Column="1" Command="{Binding CalculateCommand}" FocusManager.FocusedElement="{Binding ElementName=myDataGrid}" HorizontalAlignment="Right"> 
    <Button.Style> 
     <Style TargetType="Button"> 
      <Setter Property="IsEnabled" Value="True" />     
      <Style.Triggers> 
       <DataTrigger Binding="{Binding ElementName=myDataGrid, Path=SelectedItem}" Value="{x:Null}"> 
        <Setter Property="IsEnabled" Value="False" />       
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </Button.Style> 
    <StackPanel Orientation="Horizontal" VerticalAlignment="Center"> 
     <Image VerticalAlignment="Center" Source="/MyWPFApp;component/Images/Calculate.png"></Image> 
     <TextBlock VerticalAlignment="Center">Calculate</TextBlock> 
    </StackPanel> 
</Button> 

내가 뭘하려고하면 데이터 그리드의 현재 선택된 항목에 포커스를 설정하는 것입니다 DataGrid의 다른 항목으로 이동할 수 있습니다.

그래서 단추의 속성을 FocusManager.FocusedElement로 설정하려고 시도했지만 작동하지 않습니다. 재산의 경로를 설정하지 않고, 첫 번째 시도에서

FocusManager.FocusedElement="{Binding ElementName=myDataGrid}" 

:

FocusManager.FocusedElement="{Binding ElementName=myDataGrid}" 

때 나는 화살표 키를 최대에서의 아래를 클릭 나는 또한 경로를 지정하지 않고 그대로 설정 시도 (단추를 클릭 한 후) 키보드를 누르면 UI의 다른 컨트롤 인 DataGrid에서 현재 선택된 항목이 아닌 포커스가 변경됩니다. 재산의 경로 설정 두 번째 시도에서

: 단순히 아무것도하지 않는

FocusManager.FocusedElement="{Binding ElementName=myDataGrid, Path=SelectedItem}" 

를, 어느 DataGrid를에서나 다른 컨트롤에서 현재 선택한 항목에없는 초점을 맞 춥니 다. here을 말했듯이

또한 내가 연결된 동작을 시도했지만 그것은 작동하지 않습니다 :

<Button Grid.Column="1" Command="{Binding CalculateCommand}" classes:EventFocusAttachment.ElementToFocus="{Binding ElementName=myDataGrid}" HorizontalAlignment="Right"> 

또 다른 시도 :

그것은 두 번째 키 클릭에서 작동

, 첫 번째 클릭은 무시됩니다.

private void Button_Click_1(object sender, RoutedEventArgs e) 
    { 
     if (myDataGrid.SelectedIndex > -1) 
     { 
      var selectedRow = (Microsoft.Windows.Controls.DataGridRow)myDataGrid.ItemContainerGenerator.ContainerFromIndex(myDataGrid.SelectedIndex); 
      FocusManager.SetIsFocusScope(selectedRow, true); 
      FocusManager.SetFocusedElement(selectedRow, selectedRow); 
     } 
    } 

@Evk 솔루션이 완벽하게 작동합니다.

+1

만약 내가 당신이라면, 'Button.Click' 이벤트에서 그리드에 초점을 맞추 었습니다. 뷰 모델과 관련이 없기 때문에 완전히 볼 수 있기 때문입니다. 어떤 이유로 든 코드 숨김을 싫어하면 첨부 된 속성 \ 동작을 사용하여 코드 숨김을 수행 할 수 있습니다. – Evk

+0

@Evk 게시물의 마지막 줄을보십시오. 업데이트가 있습니다. 나는 행동을 시도하고 붙였으며 작동하지 않습니다. – user1624552

+0

그래서 'myDataGrid.Focus()'내부의 간단한 Button.Click 핸들러도 작동하지 않습니다. – Evk

답변

1

다음은 작동합니다 :

if (myDataGrid.SelectedIndex > -1) { 
    var container = (DataGridRow) myDataGrid.ItemContainerGenerator.ContainerFromIndex(myDataGrid.SelectedIndex); 
    if (container != null) { 
     container.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next)); 
    } 
} 

당신은 Button.Click 이벤트에 해당 코드를 넣을 수 있습니다 (여기 아무 잘못, 우리가하고있는 것은보기 전용 것은 완전히) 또는 당신이 좋아하지 않는 경우 코드 숨김 당신은 그것에 연결된 속성 \ 행동을 만들 수 있습니다.

+0

당신의 솔루션은 매력처럼 작동합니다! 감사! – user1624552