将焦点设置为项目控件中的第一个文本框

use*_*189 6 wpf focus datatemplate itemscontrol

假设我有一个项目控件绑定到VM上的项目列表.datatemplate内部是一个文本框.如何将焦点设置为XAML或VM中的第一个文本框?

在此先感谢您的帮助!

<ItemsControl ItemsSource="{Binding UsageItems}" Grid.Row="1" Focusable="False">
<ItemsControl.ItemTemplate>
    <DataTemplate>
            <Grid Margin="0,0,0,3">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="100"/>
                <ColumnDefinition Width="10"/>
                <ColumnDefinition Width="Auto"/>
                <ColumnDefinition Width="10"/>
                <ColumnDefinition Width="Auto"/>
                <ColumnDefinition Width="10"/>
                <ColumnDefinition Width="Auto"/>
            </Grid.ColumnDefinitions>

            <TextBlock Text="{Binding Month}" Style="{StaticResource Local_MonthLabel}" />
            <core:NumericTextBox Value="{Binding Actual, Mode=OneWay}" Style="{StaticResource Local_ActualUsageEntry}" Grid.Column="2"/>

            <core:ValidationControl Instance="{Binding Model}" Grid.Column="4" PropertyName="{Binding MonthNumber, StringFormat=AdjustedUsage{0}}">
                <core:NumericTextBox Value="{Binding Adjusted}"  DefaultValueIfNull="0" Style="{StaticResource Local_AdjustUsageEntry}" x:Name="AdjustmentEntry" inventoryLocationSetup:InitialFocusBehavior.Focus="True" />
            </core:ValidationControl>

            <telerik:RadComboBox ItemsSource="{Binding Converter={StaticResource Converter_EnumToEnumMemberViewModel}, Mode=OneTime, Source={x:Type Enums:UsageAdjustmentTypes}}" SelectedValue="{Binding Code, Mode=TwoWay}" Grid.Column="6" Style="{StaticResource Local_CodeSelector}"/>

        </Grid>
    </DataTemplate>
</ItemsControl.ItemTemplate>
Run Code Online (Sandbox Code Playgroud)

Mar*_*man 5

我使用附加的行为:

public static class InitialFocusBehavior
{
    public static bool GetFocus(DependencyObject element)
    {
        return (bool)element.GetValue(FocusProperty);
    }

    public static void SetFocus(DependencyObject element, bool value)
    {
        element.SetValue(FocusProperty, value);
    }

    public static readonly DependencyProperty FocusProperty =
        DependencyProperty.RegisterAttached(
        "Focus",
        typeof(bool),
        typeof(InitialFocusBehavior),
        new UIPropertyMetadata(false, OnElementFocused));

    static void OnElementFocused(
        DependencyObject depObj, DependencyPropertyChangedEventArgs e)
    {
        FrameworkElement element = depObj as FrameworkElement;
        if (element == null)
            return;
        element.Focus();
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在XAML中将其绑定到True以用于您要关注的元素:

<TextBox Width="200" Height="20" local:InitialFocusBehavior.Focus="True" />
Run Code Online (Sandbox Code Playgroud)

===更新===

抱歉,上面的代码仅显示了如何使用行为来使页面上的控件具有焦点,如果要对ItemControl中第一项中的元素进行操作,则必须将该行为应用于ItemsControl本身,然后在更新处理程序中通过执行以下操作找到子项:

static void OnElementFocused(DependencyObject depObj, DependencyPropertyChangedEventArgs e)
{
    ItemsControl itemsControl = depObj as ItemsControl;
    if (itemsControl == null)
        return;
    itemsControl.Loaded += (object sender, RoutedEventArgs args) =>
    {
        // get the content presented for the first listbox element
        var contentPresenter = (ContentPresenter)itemsControl.ItemContainerGenerator.ContainerFromIndex(0);

        // get the textbox and give it focus
        var textbox = contentPresenter.ContentTemplate.FindName("myTextBox", contentPresenter) as TextBox;
        textbox.Focus();
    };
}
Run Code Online (Sandbox Code Playgroud)

您会注意到,我在OnLoaded处理程序中设置了焦点,因为我假设第一次创建控件时,这些项尚未附加。

同样,您可能已经通过“本地”弄清楚了它只是定义InitialFocusBehavior类的名称空间,您需要在xaml的顶部添加以下内容:

xmlns:local="clr-namespace:YourProjectNamespace"
Run Code Online (Sandbox Code Playgroud)