在WPF中,您可以使用Command.CanExecute来设置工具提示吗?

时间:2011-07-26 19:06:43

标签: wpf command

这不是真正的代码,我知道。但这是我想做的。

MyBinding.CanExecute += (s, e) => 
{
    e.CanExecute = Something.Allow;
    if (!e.CanExecute)
        e.ToolTip = Something.Reason;
}

有一种简单的方法吗?

谢谢。

2 个答案:

答案 0 :(得分:0)

根据您的问题,我假设您是从ViewModel执行此操作。如果是这样,最简单的方法是为命令设置一个可观察的“CanExecute”属性,为工具提示设置另一个字符串“Reason”属性。

然后,您将在ViewModel中侦听PropertyChanged事件。当CanExecute属性发生更改时,您只需更新原因。

以下是一些示例代码,它只是在执行命令时将CanExecute属性设置为false:

public MyViewModel()
    : base()
{
    this.PropertyChanged += (s, e) =>
        {
            if (e.PropertyName == "SomeCommandCanExecute")
            {
                if (mSomeCommandCanExecute)
                    this.Reason = "Some Command Can Execute";
                else
                    this.Reason = "Some Command Cannot Execute Because....";
            }
        };
}

private RelayCommand mSomeCommand = null;
private Boolean mSomeCommandCanExecute = true;
public RelayCommand SomeCommand
{
    get
    {
        if (mSomeCommand == null)
        {
            mSomeCommand = new RelayCommand(
                cmd => this.ExecuteSomeCommand(),
                cmd => this.SomeCommandCanExecute);
        }

        return mSomeCommand;
    }
}

public Boolean SomeCommandCanExecute
{
    get { return mSomeCommandCanExecute; }
    set { SetProperty("SomeCommandCanExecute", ref mSomeCommandCanExecute, value); }
}


private void ExecuteSomeCommand()
{
    this.SomeCommandCanExecute = false;
}

private string mReason = "Some Command Can Execute";
public string Reason
{
    get { return mReason; }
    set { SetProperty("Reason", ref mReason, value); }
}

然后在你的视图中:

   <StackPanel>
        <Button Command="{Binding SomeCommand}"
                ToolTip="{Binding Reason}"
                Content="Some Command"/>
        <TextBlock Text="{Binding Reason}"
                   ToolTip="{Binding Reason}" />
   </StackPanel>

请注意,当CanExecute设置为false时,您将看不到禁用按钮上的工具提示,这就是我添加TextBlock以显示它的原因。您看到TextBlock上的工具提示。

答案 1 :(得分:0)

这是我相信实现这一目标的最佳方式。

这是命令定义:

class CustomCommand : RoutedUICommand, INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    private string m_Reason;
    public string Reason
    {
        get { return m_Reason; }
        set
        {
            if (m_Reason == value)
                return;
            m_Reason = value;
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs("Reason"));
        }
    }
}
public class MyCommands
{
    public static CustomCommand DoThis = new CustomCommand();
    public static CommandBinding DoThisBinding = new CommandBinding 
        { Command = DoThis };

    public static void SetupCommands()
    {
        DoThisBinding.CanExecute += (s, e) =>
        {
            var _Something = DoSomeTest(e.Parameter);
            e.CanExecute = _Something.Allow;     
            if (!e.CanExecute)         
                (e.Command as CustomCommand).Reason = _Something.Reason; 
        } 
    }
}

这是XAML实现:

xmlns:commands="MyNamespace.WhereAreCommands"

<Button Command="{x:Static commands:MyCommands.DoThis}"
        ToolTip="{Binding Path=Reason, 
            Source={x:Static commands:MyCommands.DoThis}}">
    Click</Button>