Исходя из вашего вопроса, я полагаю, вы делаете это из ViewModel.Если это так, самое простое, что нужно сделать, - это иметь наблюдаемое свойство «CanExecute» для вашей команды и другое свойство «Reason» для вашей подсказки.
Затем вы прослушиваете событие PropertyChanged в ViewModel.Когда свойство 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.