2013-05-01 72 views
4

比方說,我有一個項目控件綁定到VM上的項目列表。數據模板內部是一個文本框。我如何將焦點設置到XAML或VM中的第一個文本框?將焦點設置爲項目控件中的第1個文本框

在此先感謝您的幫助!在XAML

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(); 
    } 
} 

然後將其綁定到真正的元素,你要關注:

<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> 

回答

3

我使用附加的行爲

<TextBox Width="200" Height="20" local:InitialFocusBehavior.Focus="True" /> 

=== UPDATE ===

對不起,上面的代碼只是展示瞭如何使用一個行爲來給頁面上的控件賦予焦點,如果你想要將它做到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(); 
    }; 
} 

你會發現,我設置的焦點裝載的處理程序中,因爲我假定項目將不會一直當控件第一次創建時附加。

而且你可能已經想通了由「本地」就是這樣的InitialFocusBehavior類中定義的命名空間,你需要在XAML的頂部添加這樣的事情:

xmlns:local="clr-namespace:YourProjectNamespace" 
+0

感謝馬克,我試圖測試一下,但它不喜歡XAML,全是紅色。 「本地:」來自哪裏?對不起,不是XAML開發人員。 :-) – user2041189 2013-05-02 13:34:59

+0

好吧,我試過了,它不起作用。 ItemsControl DataTemplate中的焦點甚至不在控件中,而是位於控件之外的文本框中。它確實彈出到OnElementFocused中,但是它爲每個創建的控件提供了一次該方法(對於它所綁定的項目列表中的每個項目都是1),這導致我相信即使這樣做能夠設置將焦點放在最後一個文本框中,而不是第一個。任何其他想法?我將在下面發佈我的xaml。 – user2041189 2013-05-02 14:04:56

+0

在原始問題中發佈xaml,謝謝。 – user2041189 2013-05-02 14:07:18

相關問題