Я полностью согласен с ответом Даниэля, но позвольте мне прояснить эту идею с помощью некоторого кода.
Сначала давайте определим прикрепленное поведение, которое реагирует на «истинные» -значения, и установим фокус для его владельца.
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 только для первого элемента.