WPF Фокус на элементе ListBox с шаблоном управления - PullRequest
1 голос
/ 07 апреля 2011

У меня есть список с шаблоном элемента в виде текстового поля и кнопка (Добавить). при каждом нажатии кнопки добавляется еще один элемент (текстовое поле). После того, как кнопка нажата, я хочу выделить первое текстовое поле или поле, которое было добавлено недавно. Как я могу сделать это в WPF. Если это возможно из MVVM заканчивается тестируемым способом

Ответы [ 2 ]

3 голосов
/ 07 апреля 2011

Я полностью согласен с ответом Даниэля, но позвольте мне прояснить эту идею с помощью некоторого кода.

Сначала давайте определим прикрепленное поведение, которое реагирует на «истинные» -значения, и установим фокус для его владельца.

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 только для первого элемента.

2 голосов
/ 07 апреля 2011

Я бы сделал это так:

  1. В вашей ВМ есть ObservableCollection с предметами.
  2. В вашей виртуальной машине есть свойство SelectedItem.
  3. В вашей виртуальной машине есть команда AddItem.
  4. Подключите кнопку к команде AddItem.
  5. Свяжите SelectedItem вашего ComboBox с SelectedItem вашей виртуальной машины.
  6. В команде AddItem добавьте элемент к ObservableCollection и назначьте его SelectedItem вашей виртуальной машины.
  7. В вашем DataTemplate убедитесь, что TextBox получает фокус при выборе элемента.

Чтобы достичь последнего пункта, вы можете создать присоединенное свойство, которое возвращает IsFocused в методе получения и вызывает Focus в методе установки. Затем вы можете прикрепить это свойство к текстовому полю и привязать его к свойству IsFocused в вашем элементе.

...