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

Wpf 将焦点设置为items控件中的第一个文本框,wpf,focus,datatemplate,itemscontrol,Wpf,Focus,Datatemplate,Itemscontrol,假设我有一个items控件,它绑定到VM上的项目列表。数据模板中有一个文本框。如何将焦点设置为XAML或VM中的第一个文本框 提前感谢您的帮助 <ItemsControl ItemsSource="{Binding UsageItems}" Grid.Row="1" Focusable="False"> <ItemsControl.ItemTemplate> <DataTemplate> <Grid Margin="0,0

假设我有一个items控件,它绑定到VM上的项目列表。数据模板中有一个文本框。如何将焦点设置为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>


我使用附加的行为:

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();
    }
}
然后,在XAML中,为要聚焦的元素将其绑定为True:

<TextBox Width="200" Height="20" local:InitialFocusBehavior.Focus="True" />
您会注意到,我在onload处理程序中设置了焦点,因为我假设在首次创建控件时,这些项还没有被附加

另外,您可能已经通过“local”了解到它只是定义InitialFocusBehavior类的名称空间,您需要在xaml的顶部添加如下内容:

xmlns:local="clr-namespace:YourProjectNamespace"

谢谢Mark,我正在尝试测试这个,但是它不喜欢XAML,全是红色的。“本地:”来自哪里?抱歉,不是XAML开发人员。:-)好吧,我试过了,但不起作用。焦点甚至不在ItemsControl数据模板中的控件中,而是在控件外部的文本框中。它确实出现在OnElementFocused中,但对于创建的每个控件(绑定到的项列表中的每个项都有一个),它都会出现在该方法中一次,这让我相信,即使这样做有效,它也会将焦点设置到最后一个文本框,而不是第一个文本框。还有其他想法吗?我将在下面发布我的xaml。有什么方法可以使Itemscontrol(拥有itemtemplate)中的第一个文本框成为焦点吗?我尝试了上述方法,但没有成功!你更新的解决方案对我有效。我还想专注于itemscontrol中的第一个文本框,它就像一个符咒。
xmlns:local="clr-namespace:YourProjectNamespace"