我有一个列表框,项目模板为文本框和按钮(添加)。只要单击按钮,就会添加一个项目(文本框)。单击按钮后,我想将焦点放在第一个文本框或最近添加的文本框中。我怎么能在WPF中做到这一点。如果可能从MVVM端以可测试方式
答案 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)
我会这样做:
ObservableCollection
项目。SelectedItem
。AddItem
。AddItem
。SelectedItem
的{{1}}绑定到虚拟机的ComboBox
。SelectedItem
命令中,将该项添加到AddItem
并将其分配给您的VM的ObservableCollection
。要实现最后一点,您可以创建一个附加属性,该属性在getter中返回SelectedItem
并在setter中调用IsFocused
。然后,您可以将此属性附加到文本框并将其绑定到项目中的Focus
属性。