2009-04-21 7 views
1

Comment définir un focus de contrôle utilisateur dans MVVM? Utilisation de Focusmanager.FocusElement = {Binding ...} N'a aucun effet.WPFMVVM Définir le contrôle du focus

Voici mon XAML:

<DataTemplate DataType="{x:Type client:TelephoneNumberViewModel}"> 
    <Grid FocusManager.FocusedElement="{Binding ElementName=TelephoneNumber}" Width="1024" Height="540"> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="60" /> 
      <RowDefinition Height="*" /> 
      <RowDefinition Height="*" /> 
      <RowDefinition Height="*" /> 
      <RowDefinition Height="*" /> 
      <RowDefinition Height="*" /> 
      <RowDefinition Height="*" /> 
      <RowDefinition Height="80" /> 
     </Grid.RowDefinitions> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="25" /> 
      <ColumnDefinition Width="*" /> 
      <ColumnDefinition Width="*" /> 
      <ColumnDefinition Width="*" /> 
      <ColumnDefinition Width="*" /> 
      <ColumnDefinition Width="*" /> 
      <ColumnDefinition Width="*" /> 
      <ColumnDefinition Width="*" /> 
     </Grid.ColumnDefinitions> 

     <TextBlock Margin="0 25 0 0" HorizontalAlignment="Left" Grid.Row="0" Grid.Column="1" 
      Grid.ColumnSpan="7" Name="textBlockQuestion" 
      TextWrapping="Wrap" Style="{DynamicResource TitleTextBlock}">"What is your telephone number?"</TextBlock> 

     <Grid Grid.Column="1" Grid.Row="1" Grid.RowSpan="7" 
      Grid.ColumnSpan="7" Height="460"> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="170" /> 
       <ColumnDefinition /> 
      </Grid.ColumnDefinitions> 
      <Grid.RowDefinitions> 
       <RowDefinition Height="80" /> 
       <RowDefinition Height="80" /> 
       <RowDefinition Height="80" /> 
       <RowDefinition Height="80" /> 
       <RowDefinition Height="100" /> 
      </Grid.RowDefinitions> 

      <StackPanel Grid.Row="0" Grid.RowSpan="5" Grid.Column="0" Grid.ColumnSpan="2" VerticalAlignment="Top" HorizontalAlignment="Left"> 
       <wpfclient:TelephoneBox Name="TelephoneNumber" TelephoneNumber="{Binding PhoneNumber, Mode=TwoWay}" /> 
       <!--<TextBox Width="500" VerticalAlignment="Top" HorizontalAlignment="Left" FontSize="40" TextAlignment="Center" Text="{Binding PhoneNumber}"></TextBox>--> 

       <StackPanel Orientation="Horizontal" Margin="0 40 0 0"> 
        <StackPanel Orientation="Vertical" Margin="0 0 60 0" > 
         <Button Margin="0 0 0 20" Style="{DynamicResource LargeGlossyButtonStyle}" Command="{Binding SurveyMobileCommand}">Mobile</Button> 
         <Button Style="{DynamicResource LargeGlossyButtonStyle}" Command="{Binding SurveyHomeCommand}">Home</Button> 

        </StackPanel> 
        <StackPanel Orientation="Vertical"> 
         <Button Margin="0 0 0 20" Style="{DynamicResource LargeGlossyButtonStyle}" Command="{Binding SurveyWorkCommand}">Work</Button> 
         <Button Style="{DynamicResource LargeGlossyButtonStyle}" Command="{Binding SurveyOtherCommand}">Other</Button> 
        </StackPanel> 
       </StackPanel> 



      </StackPanel> 


     </Grid> 



     <Grid Width="1024" Height="80" Grid.Row="7" Grid.Column="0" Grid.ColumnSpan="8" VerticalAlignment="Bottom"> 
      <Grid.RowDefinitions> 
       <RowDefinition Height="*"/> 
      </Grid.RowDefinitions> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="*"/> 
       <ColumnDefinition Width="*"/> 
       <ColumnDefinition Width="*"/> 
      </Grid.ColumnDefinitions> 
      <Button Margin="60 0 0 20" Grid.Column="0" Grid.Row="0" Name="buttonContinue" 
        Command="{Binding SurveySkipCommand}" Style="{DynamicResource LargeGlossyButtonStyle}" 
        >Skip</Button> 
     </Grid> 



    </Grid> 
</DataTemplate> 

Le contrôle de l'utilisateur ne soit pas mise au point jusqu'à ce que je onglet encore une fois.

Répondre

1

Utilisez FocusManager.FocusedElement.

Modifier après votre modification: Je ne pense pas qu'il soit possible de dire sans voir tout le code, mais je pense que cela pourrait être un problème de cadrage. Vous définissez le focus logique sur le contrôle téléphonique, mais celui-ci n'aura que le focus clavier si cette portée logique est active. Je soupçonne que quelque chose en dehors du contrôle étant modélisé a sa propre portée de focus et ce n'est pas jusqu'à ce que vous atteigniez l'onglet que la portée se déplace dans UserControl.

+0

S'il vous plaît voir ma mise à jour. La boîte de téléphone ne mater pas où je place le FocusManager.FocusedElement ne obtient jamais le focus. – cjibo

0

Quel est le contexte de l'objectif? Sont-ils en train de tabuler sur le contrôle, le contrôle est-il concentré au fur et à mesure qu'un nouvel élément est ajouté?

Dans ce dernier cas, assurez-vous que la zone de liste le DataTemplate est pour a IsSynchronizedWithCurrentItem = « true »

+0

La base est quand le viewmodel est chargé, je veux que le TelephoneBox soit focalisé pour l'entrée. Nous utilisons Prism de sorte que ViewModel est défini dans une région. – cjibo

+0

Vous devrez peut-être regarder vos éléments parents et si c'est le UserCOntrol parent qui a le focus, vous pouvez vous assurer que Focusable = "False" sur les contrôles parents - pas sûr comment Prism déclare le parent. Vous voudrez peut-être utiliser Mole pour voir ce qui obtient le focus si vous ne pouvez pas le trouver dans votre code-behind. http://karlshifflett.wordpress.com/mole-for-visual-studio/ –

Questions connexes