реализовать CanExecute MVVM light с помощью ICommand

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

Я использую MVVM light и получил команду, реализующую интерфейс ICommand.

Я пытался использовать Keyboard.FocusedElement, но это ничего не возвращает.

Это код для команды (обратите внимание, что она просто возвращает true прямо сейчас, чтобы заставить ее работать, это, конечно, то, что я пытаюсь исправить):

class AddItemToNodeCommand<T> : ICommand
{
    public bool CanExecute(object parameter)
    {
        Debug.WriteLine("fokuselement er: " + Keyboard.FocusedElement);    
       return true;
      //  throw new NotImplementedException();
    }

    public event EventHandler CanExecuteChanged;

    public void Execute(object parameter)
    {
        Debug.WriteLine("Parameter er: " + parameter);
        Debug.WriteLine("fokuselement er: " + Keyboard.FocusedElement);

        //throw new NotImplementedException();
    }
}

Из модели представления:

public ICommand AddItemToNodeCommand { get; private set; }
AddItemToNodeCommand = new AddItemToNodeCommand<object>();

И, наконец, немного XAML:

<RibbonButton SmallImageSource="../Images/whatever.png" Label="Attribute" Command="{Binding AddItemToNodeCommand}" CommandParameter="Attribute"/>

Я не опубликовал xaml для userControl, но идея в том, что когда userControl имеет фокус, CanExecute должен быть истинным. Я думал, что это будет работать с Keyboard.FokusedElement, но я ошибался. Что я могу сделать?

Заранее спасибо.


person Jesper Plantener    schedule 20.10.2013    source источник
comment
ваша кнопка является дочерним элементом пользовательского элемента управления, на котором вы хотите проверить фокус?   -  person Nitin    schedule 20.10.2013
comment
Нет, кнопка является частью другого пользовательского элемента управления (элемент управления ленты).   -  person Jesper Plantener    schedule 20.10.2013
comment
Глядя на функциональную точку зрения, я думаю, что как только вы переместите фокус с пользовательского элемента управления, кнопка станет неактивной. Поэтому я не думаю, что кнопка остается полезной по функциональности. Поправьте меня, если я не понял вашей проблемы.   -  person Palak.Maheria    schedule 21.10.2013
comment
Привет Палак. Да, я понимаю твою точку зрения. Несмотря на то, что то, что я сделал бы, вероятно, не сработает, я все еще не понимаю, почему Keyboard.Focus ничего не возвращает. Я пытаюсь добиться того, что когда я нажимаю на userControl, кнопка должна быть доступна, пока фокус не будет перемещен на что-то другое (например, другой userControl)   -  person Jesper Plantener    schedule 21.10.2013


Ответы (1)


Кажется, что Keyboard.FocusedElement немного непостоянен.

Посмотрите здесь решение, связанное с присоединенным поведением и переопределение Keyboard.GotKeyboardFocusEvent. Я попробовал это, и это, кажется, работает.

В противном случае вы можете привязаться к IsKeyboardFocused или IsKeyboardFocusWithin. Просто поместите это в свой xaml для быстрого примера:

<StackPanel>
<TextBox Name="test_txtbx" >Hullo</TextBox>
    <TextBox Name="test_txtbx_2">Hullo 2</TextBox>
    <Label Content="{Binding ElementName=test_txtbx, Path=IsKeyboardFocused}"></Label>
    <Label Content="{Binding ElementName=test_txtbx_2,Path=IsKeyboardFocusWithin }"></Label>
    <Button Click="TestClick">test me </Button>
</StackPanel>

Метка показывает, имеет ли фокус соответствующее текстовое поле.

(Вот старая статья, в которой говорится, что это тоже забавно .. не знаю, если все еще актуально).

person Noctis    schedule 24.10.2013