使用ICommand实现CanExecute MVVM灯

时间:2013-10-20 13:14:55

标签: wpf mvvm mvvm-light icommand canexecute

我有一个程序,只有相应的userControl具有焦点时才能激活按钮。

我正在使用MVVM灯,并获得了一个实现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();
    }
}

来自viewmodel:

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

最后是一些XAML:

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

我没有为userControl发布xaml,但是想法是当userControl有焦点时,CanExecute应该是真的..我认为它适用于Keyboard.FokusedElement,但我错了。我该怎么办?

提前谢谢。

1 个答案:

答案 0 :(得分:0)

似乎Keyboard.FocusedElement有点邪恶。

查看here以获取涉及附加行为并覆盖Keyboard.GotKeyboardFocusEvent的解决方案。我试了一下,似乎工作了。

否则,您可以绑定到IsKeyboardFocusedIsKeyboardFocusWithin。只需将它放在你的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>

标签显示匹配的文本框是否具有焦点。

(这是一个old article,其中说焦点也很有趣..但如果仍然相关的话也不知道。)