2017-10-24 16 views
1

Visual Studio 2008およびNET Framework 3.5 SP1にはMVVM WPFアプリケーションがあります。他のコントロールの中でも、このアプリケーションにはデータグリッドとボタンがあります。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内の現在選択されている項目にフォーカスを設定することです私は、DataGridの他の項目に移動することができます。

私はFocusManager.FocusedElementボタンのプロパティを設定しようとしましたが、機能しません。プロパティでパスを設定せずに、最初の試みで

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

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

は、ときに私は矢印キーアップ中のダウンをクリックし、私もパスを指定せずにあるように設定しようとしています(ボタンをクリックした後の)キーボードでは、フォーカスは、データグリッド内の現在選択されている項目ではないUI内の別のコントロールに変更されます。プロパティでのパスの設定第二の試みで

、:それは単に何もしない

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

を、どちらもデータグリッド内でも他のコントロールで現在選択されている項目でnoフォーカス。 hereが言ったように

はまた、私は添付の動作を試してみましたが、それは動作していない:

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

別の試み

をそれが最初のクリックが無視され、第2の鍵をクリックし、上で動作します。

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

関連する問題