2011-11-27 79 views
1

我對WPF和XAML很陌生。我用文本框項目製作了Listbox,我希望所選項目的文本框在選擇該項目時得到關注。我的朋友建議我使用ItemContainer,並且我嘗試使用一個觸發器,其設置屬性爲TextBox.IsFocused,但我不斷收到一個不能設置錯誤的IsFocused將焦點設置爲List DataTemplate下的文本框

出了什麼問題?下面是我的代碼:

更新了XAML:

<DataTemplate x:Key="Template"> 
      <Grid Margin="3"> 
       <Border BorderThickness="2" BorderBrush="Black" 
          Background="{Binding RelativeSource= 
          { 
          RelativeSource 
          Mode=FindAncestor, 
          AncestorType={x:Type ListBoxItem} 
          }, 
          Path=Background 
         }" CornerRadius="4"> 
        <StackPanel HorizontalAlignment="Stretch" Margin="3" > 
         <StackPanel.Style> 
          <Style> 
           <Setter Property="TextBlock.Foreground" Value="Black"></Setter> 
          </Style> 
         </StackPanel.Style> 
         <TextBlock Foreground="White" FontSize="18" TextWrapping="Wrap" Text="{Binding Path=BenefitDesc}"></TextBlock> 
         <Grid Margin="3" HorizontalAlignment="Stretch"> 
          <Grid.ColumnDefinitions> 
           <ColumnDefinition Width="Auto" /> 
           <ColumnDefinition Width="1*" /> 
          </Grid.ColumnDefinitions> 
          <Grid.RowDefinitions> 
           <RowDefinition /> 
           <RowDefinition /> 
          </Grid.RowDefinitions> 
          <TextBlock Foreground="White" Margin="3" FontSize="16" TextWrapping="Wrap">Price:</TextBlock> 
          <TextBox x:Name="txtUpdate" FontSize="16" Grid.Column="1" TextWrapping="Wrap" Text="{Binding Path=Price}" Margin="3"> 
          </TextBox> 
         </Grid> 
        </StackPanel> 
       </Border> 
      </Grid> 
     </DataTemplate> 
    </Window.Resources> 
    <Grid> 
     <ListBox x:Name="lsItem" ScrollViewer.HorizontalScrollBarVisibility="Disabled" 
       HorizontalContentAlignment="Stretch" Background="#FF2CB7D2" SelectionChanged="lsBenPriceEditor_SelectionChanged" 
       ItemTemplate="{StaticResource Template}"> 
      <ListBox.ItemContainerStyle> 
       <Style> 
        <Setter Property="Control.Padding" Value="0"></Setter> 
        <Style.Triggers> 
         <Trigger Property="ListBoxItem.IsSelected" Value="True"> 
          <Setter Property="ListBoxItem.Background" Value="DarkRed" /> 
         </Trigger> 
        </Style.Triggers> 
       </Style> 
      </ListBox.ItemContainerStyle> 
     </ListBox> 
    </Grid> 
+0

看看http://stackoverflow.com/questions/329556/focus-on-a-textbox-in-a-datatemplate幫助。 –

+0

@MattHamilton我想在該頁面上的第一個答案,並不斷遇到錯誤的方法不存在於給定的行:var myTemplate = FindResource(「MyTemplateKey」);我將var更改爲Framework元素,但是這次我得到的錯誤對象引用未設置爲根據對該答案的評論對象 –

+0

的引用,請確保將FindResource的返回值作爲DataTemplate進行投射。 FindResource只是返回一個System.Object。 –

回答

1

你可以在你的代碼掛鉤SelectionChanged事件背後爲你的列表框和那裏你可以遍歷您的SelectedItem的視覺孩子找到自己的TextBox和只需撥打textBox.Focus()即可將重點放在文本框上。

代碼

private void ListBox_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    ListBox lb = sender as ListBox; 
    ListBoxItem lbi = (ListBoxItem)lb.ItemContainerGenerator.ContainerFromItem(lb.SelectedItem); 
    TextBox textBox = GetVisualChild<TextBox>(lbi); 
    if (textBox != null) 
     textBox.Focus(); 
} 

private T GetVisualChild<T>(Visual parent) where T : Visual 
{ 
    T child = default(T); 
    int numVisuals = VisualTreeHelper.GetChildrenCount(parent); 
    for (int i = 0; i < numVisuals; i++) 
    { 
     Visual v = (Visual)VisualTreeHelper.GetChild(parent, i); 
     child = v as T; 
     if (child == null) 
     { 
     child = GetVisualChild<T>(v); 
     } 
     if (child != null) 
     { 
     break; 
     } 
    } 
    return child; 
} 

GetVisualChild是,你可以通過使用VisualChildren循環的傳遞UIControl(ListBoxItem in your case)並從中VisualChildren列表返回所需的元素T(TextBox in your case)泛型方法。

此外,由UIElement公開的IsFocused屬性是僅獲取屬性。

public bool IsFocused { get; } 

這就是爲什麼你收到此錯誤..