WPMVVM Установить фокус управления

Как в MVVM установить фокус пользовательского управления? Использование Focusmanager.FocusElement={Binding ...} не влияет.

Вот мой 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>

Пользовательский элемент управления не получает фокуса, пока я еще раз не включу вкладку.


person cjibo    schedule 21.04.2009    source источник


Ответы (2)


Используйте FocusManager.FocusedElement.

Редактировать после редактирования: я не думаю, что можно сказать, не видя весь ваш код, но я думаю, что это может быть проблема области фокуса. Вы устанавливаете логический фокус на элемент управления телефоном, но он будет иметь фокус клавиатуры только в том случае, если эта логическая область является активной. Я подозреваю, что что-то за пределами шаблонного элемента управления имеет свою собственную область фокуса, и только после того, как вы нажмете вкладку, область перемещается в UserControl.

person Kent Boogaart    schedule 21.04.2009
comment
Пожалуйста, смотрите мое обновление. Телефонная будка, где бы я ни размещал FocusManager.FocusedElement, никогда не получает фокуса. - person cjibo; 21.04.2009

Каков контекст фокуса? Переходят ли они к элементу управления, получает ли элемент управления фокус при добавлении нового элемента?

Если последнее, убедитесь, что ListBox, для которого предназначен DataTemplate, имеет IsSynchronizedWithCurrentItem="True"

person Jeff Wain    schedule 21.04.2009
comment
Основой является то, что при загрузке модели просмотра я хочу, чтобы TelephoneBox был сфокусирован для ввода. Мы используем Prism, поэтому ViewModel устанавливается в регион. - person cjibo; 21.04.2009
comment
Возможно, вам придется посмотреть на ваши родительские элементы, и если фокус находится на родительском UserControl, вы можете убедиться, что Focusable=False на родительских элементах управления - не знаете, как Prism объявляет родителя. Вы можете использовать Mole, чтобы увидеть, что получает фокус, если вы не можете найти это в своем коде программной части. karlshifflett.wordpress.com/mole-for-visual-studio - person Jeff Wain; 21.04.2009