Порядок табуляции и индекс в WPF с использованием шаблона MVVM

У меня проблема с табуляцией в элементах управления в приложении WPF с использованием шаблона MVVM. У меня есть следующий XAML, который определяет древовидную структуру

<Grid Background="Transparent" Margin="10">
    <TreeView ItemsSource="{Binding FirstLevelNavigableViewModels}" Background="Transparent" 
              HorizontalContentAlignment="Stretch"
              HorizontalAlignment="Stretch"
              BorderThickness="0"
              ItemContainerStyle="{StaticResource TreeViewItemStyle1}">
        <TreeView.Resources>
            <HierarchicalDataTemplate DataType="{x:Type ViewModel:VendorViewModel}" ItemsSource="{Binding Children}">
                <View:VendorView HorizontalContentAlignment="Stretch" />
            </HierarchicalDataTemplate>

            <DataTemplate DataType="{x:Type ViewModel:ProductViewModel}">
                <View:ProductView HorizontalContentAlignment="Stretch" />
            </DataTemplate>
        </TreeView.Resources>
    </TreeView>
</Grid>

Когда древовидное представление загружено, XAML для "ProductView" выглядит следующим образом

<Border Margin="0,2,2,2" CornerRadius="3" Background="#3FC7B299" DockPanel.Dock="Right" HorizontalAlignment="Right" Width="109">
    <StackPanel Orientation="Vertical" Margin="6,4">
        <DockPanel>
            <TextBlock  DockPanel.Dock="Left" FontFamily="Segoe" FontSize="10" FontWeight="Medium"
                        Foreground="Black" Opacity="0.75" 
                        Text="CALC. REG. PRICE"></TextBlock>
            <Button Width="10" Height="10" Background="Transparent" BorderBrush="Transparent" BorderThickness="0" Padding="-4" Margin="0" Command="{Binding UserDefinedRetailPriceCommand}" Visibility="{Binding UserDefinedRetailPriceButtonView}">
                <Image Width="10" Height="10" Source="/Arhaus.Pricing.Client;component/Styles/Images/error.png"></Image>
            </Button>
        </DockPanel>
        <TextBox    FontFamily="Segoe" FontSize="16" FontWeight="Medium" KeyboardNavigation.IsTabStop="True" KeyboardNavigation.TabIndex="{Binding RegularPriceTabIndex}"
                    Foreground="Black" Opacity="0.9" KeyboardNavigation.TabNavigation="Continue"
                    ebf:LostFocusBehaviour.LostFocusCommand = "{Binding LostFocusSugg}"
                    Text="{Binding NewSuggestedRetailPrice,Converter={StaticResource FormattingConverter}, ConverterParameter=' \{0:C\}', Mode=TwoWay, UpdateSourceTrigger=LostFocus}" Background="#FFE6DED3" BorderBrush="#FFE6DED3" DataContext="{Binding StringFormat=\{0:c\}, NotifyOnValidationError=True}" Padding="0" TabIndex="1"></TextBox>
    </StackPanel>
</Border>

У меня есть индекс вкладки, привязанный к целому числу, которое постоянно увеличивается и привязано по мере загрузки древовидного представления (т.е. у меня он настраивается как индекс вкладки 1, 2, 3 и т. Д., Когда загружается каждая последующая модель).

Я хотел бы иметь возможность нажать вкладку и перейти к следующему текстовому полю в древовидном представлении, но когда я нажимаю клавишу TAB, ничего не происходит. Я не уверен, правильно ли я настроил табуляцию, но я новичок в WPF и не знаю, где и как установить табуляцию, чтобы она работала. Я привык к WinForms, где вы просто устанавливаете индекс вкладки и переходите оттуда.

Спасибо за помощь, прошу прощения за большой блок кода.


person Community    schedule 07.09.2010    source источник


Ответы (1)


У меня нет готового решения, но есть некоторые мысли, которые могут помочь:

Я не знаю, что возвращает RegularPriceTabIndex, но, вероятно, он начинается для каждого нового TreeViewItem с того же индекса? Один и тот же индекс табуляции задается несколько раз из-за многократного использования ProductView. Возможно, это приводит к проблеме. Вы можете попробовать установить FocusManager.IsFocusScope = "true " для ProductView. Может это поможет.

Попробуйте также установить Control .IsTabStop = "true" в текстовом поле.

person HCL    schedule 07.09.2010
comment
Спасибо за ответ!! Я знаю, что RegularPriceTabIndex уникален. Я загружаю дерево, затем просматриваю все дерево после факта и устанавливаю RegularPriceTabIndex с текущим счетчиком. Попробую менеджер фокуса и Control.IsTabStop ... спасибо! - person ; 07.09.2010
comment
Остановка табуляции уже установлена, и я добавил в FocusManager.IsFocusScope, но безрезультатно, TAB по-прежнему не будет прыгать между элементами дерева. - person ; 08.09.2010
comment
@Scott Vercuski: Я бы попытался удалить все атрибуты из TextBox и начать с нуля, устанавливая атрибут для каждого атрибута, начиная с IsTabStop = true. Возможно, вы также можете попытаться визуализировать RegularPriceTabIndex с помощью Text = {Binding RegularPriceTabIndex}. Однако я должен признать, что у меня никогда не было такой комбинации вкладок, и я не знаю, есть ли проблема по дизайну, которая мешает навигации по вкладкам. - person HCL; 08.09.2010