2011-04-07 45 views
1

我有一個帶有作爲文本框和項目按鈕(添加)的項目模板的列表框。無論何時單擊按鈕,都會添加一個項目(文本框)。一旦點擊了按鈕,我想將焦點放在第一個文本框或最近添加的文本框上。我怎樣才能做到這一點在WPF.If可能從MVVM結束與可驗證的方式WPF專注於帶控制模板的列表框項目

+0

你可以在這裏發佈相關的xaml代碼嗎?這將很容易找出你的代碼.. – 2011-04-07 06:39:47

回答

3

我完全同意丹尼爾的回答,但讓我用一些代碼澄清這個想法。首先讓我們定義附加的行爲,對「真」值做出反應併爲其所有者設置焦點。

public static class FocusBehaviour 
{ 
    public static bool GetForceFocus(DependencyObject d) 
    { 
     return (bool)d.GetValue(FocusBehaviour.ForceFocusProperty); 
    } 

    public static void SetForceFocus(DependencyObject d, bool val) 
    { 
     d.SetValue(FocusBehaviour.ForceFocusProperty, val); 
    } 

    public static readonly DependencyProperty ForceFocusProperty = 
     DependencyProperty.RegisterAttached("ForceFocus", 
      typeof(bool), 
      typeof(FocusBehaviour), 
      new FrameworkPropertyMetadata(false, 
       FrameworkPropertyMetadataOptions.None, 
       (d, e) => 
        { 
         if((bool)e.NewValue) 
         { 
          if (d is UIElement) 
          { 
           ((UIElement)d).Focus(); 
          } 
         } 
        })); 
} 

然後添加這種行爲對我們的文本框:

<DataTemplate> 
    <TextBox self:FocusBehaviour.ForceFocus="{Binding IsFocused}"/> 
</DataTemplate> 

當然,你應該IsFocused屬性添加到您的項目類:

public class Item : ObservableObject 
{ 
    //... 
    private bool _isFocused = true; 
    public bool IsFocused 
    { 
     get 
     { 
      return this._isFocused; 
     } 
     set 
     { 
      this._isFocused = value; 
      this.OnPropertyChanged("IsFocused"); 
     } 
    } 
} 

和地方在你的代碼,你應該與操縱IsFocused屬性爲您的項目。 例如,添加新項目時,應重置所有項目的IsFocused,但新手除外。初始化集合時,應僅爲第一項設置IsFocused。

+0

這真的幫了我,但我不得不添加一個while循環來使用VisualTreeHelper找到第一個具有Focusable == true的父項, – 2011-12-27 15:39:59

2

我會做這樣的:

  1. 在你的虛擬機,與該項目一ObservableCollection
  2. 在您的VM中,有一個屬性SelectedItem
  3. 在你的VM中,有一個命令AddItem
  4. 將按鈕連接到命令AddItem
  5. 將您的ComboBoxSelectedItem綁定到您的虛擬機的SelectedItem
  6. AddItem命令中,將該項添加到ObservableCollection並將其分配給您的VM的SelectedItem
  7. 在您的DataTemplate中,確保文本框在選擇該項目時獲得焦點。

爲了達到最後一點,您可以創建一個附加屬性,該屬性在獲取方中返回IsFocused,並在設置方中調用Focus。然後,您可以將此屬性附加到文本框並將其綁定到項目中的IsFocused屬性。