WPF使用控件模板关注ListBox项

时间:2011-04-07 06:09:00

标签: wpf mvvm wpf-controls

我有一个列表框,项目模板为文本框和按钮(添加)。只要单击按钮,就会添加一个项目(文本框)。单击按钮后,我想将焦点放在第一个文本框或最近添加的文本框中。我怎么能在WPF中做到这一点。如果可能从MVVM端以可测试方式

2 个答案:

答案 0 :(得分: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();
                            }
                        }
                    }));
}

然后将此行为添加到TextBox:

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

答案 1 :(得分:2)

我会这样做:

  1. 在您的虚拟机中,拥有ObservableCollection项目。
  2. 在您的虚拟机中,拥有一个属性SelectedItem
  3. 在您的虚拟机中,拥有一个命令AddItem
  4. 将按钮连接到命令AddItem
  5. SelectedItem的{​​{1}}绑定到虚拟机的ComboBox
  6. SelectedItem命令中,将该项添加到AddItem并将其分配给您的VM的ObservableCollection
  7. 在DataTemplate中,确保TextBox在选中项目时获得焦点。
  8. 要实现最后一点,您可以创建一个附加属性,该属性在getter中返回SelectedItem并在setter中调用IsFocused。然后,您可以将此属性附加到文本框并将其绑定到项目中的Focus属性。