2013-03-12 190 views
6

私は複数のテキストボックスでグリッドを持っています。アクションに応じて、ユーザーがフォーカスを取る可能性があるのは、テキストボックスの1つに変更する必要があります。現在のソリューションでは、ViewModelの文字列プロパティとxamlのデータトリガを使用してフォーカスを変更しています。それはうまく動作しますが、これを達成するためにはかなりラウンドアラウンドな方法のようですので、私はそれが明確な方法で行うことができますか?あなたがプロパティの値と要素の名前を見ることができるようにMVVMでWPFのフォーカスを設定

<Grid.Style> 
     <Style TargetType="Grid"> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding FocusedItem}" Value="number"> 
        <Setter Property="FocusManager.FocusedElement" Value="{Binding ElementName=number}"/> 
       </DataTrigger> 
       <DataTrigger Binding="{Binding FocusedItem}" Value="name"> 
        <Setter Property="FocusManager.FocusedElement" Value="{Binding ElementName=name}"/> 
       </DataTrigger> 
       <DataTrigger Binding="{Binding FocusedItem}" Value="id"> 
        <Setter Property="FocusManager.FocusedElement" Value="{Binding ElementName=id}"/> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </Grid.Style> 

は同じであるので、私が代わりに要素ごとに1つのトリガーを有していると、このI単一のトリガを行うしたいと思います。

誰かがよりクリーンな方法を考え出すことができますか?事前

+0

このようにフォーカスを設定する理由は何ですか?ユーザーがTabIndexでタブすることもできるので、フォーカスを一度設定する必要があるのは – WiiMaxx

+1

です。このソリューションはあなたにとって役に立ちます。 – blindmeis

+2

個人的にフォーカスはUI固有のコンセプトだと思います私のViewModelではなくViewのコードビハインドでのすべてのフォーカス処理(フォーカスにビジネスロジックで特定の意味がある場合を除きます)。 – Rachel

答えて

4

おかげで、私は私のプロジェクトの一つにフォーカスを設定取り扱わ方法は、(私はこれから提示されたオリジナルのポストを見たところ、私は覚えていない謝罪)フォーカス拡張子を使用していました。

public static class FocusExtension 
    { 
     public static bool GetIsFocused(DependencyObject obj) 
     { 
      return (bool)obj.GetValue(IsFocusedProperty); 
     } 


     public static void SetIsFocused(DependencyObject obj, bool value) 
     { 
      obj.SetValue(IsFocusedProperty, value); 
     } 


     public static readonly DependencyProperty IsFocusedProperty = 
       DependencyProperty.RegisterAttached(
       "IsFocused", typeof(bool), typeof(FocusExtension), 
       new UIPropertyMetadata(false, OnIsFocusedPropertyChanged)); 


     private static void OnIsFocusedPropertyChanged(DependencyObject d, 
       DependencyPropertyChangedEventArgs e) 
     { 
      var uie = (UIElement)d; 
      if ((bool)e.NewValue) 
      { 
       uie.Focus(); 
      } 
     } 
    } 

そして、XAMLファイルで、私は依存関係プロパティとしてそれを使用します。

<TextBox Uid="TB1" FontSize="13" localExtensions:FocusExtension.IsFocused="{Binding Path=TB1Focus}" Height="24" HorizontalAlignment="Left" Margin="113,56,0,0" Name="TB_UserName" VerticalAlignment="Top" Width="165" Text="{Binding Path=TB1Value, UpdateSourceTrigger=PropertyChanged}" /> 

あなたはその後、フォーカスを設定するバインディングを使用することができます。

+1

ありがとうございます。私はこのようなソリューションを使用することを考えましたが、実際のUIに自分のVMをあまりにも強く結合するので、それに対して決定しました。私はコードビハインドがおそらくやっていくと思っています。 – Farawin

+0

あなたのテキストボックスにもFocusable = "True"が設定されている必要があります。そうでなければ正常に動作しません。 – krilovich

+1

元の投稿はhttp://stackoverflow.com/questions/1356045/set-focus-on-textbox-in- wpf-view-model-c-wpf –

関連する問題