В WPF, вы можете использовать Command.CanExecute для установки всплывающей подсказки? - PullRequest
0 голосов
/ 26 июля 2011

Это не настоящий код, я знаю. Но это то, что я хотел бы сделать.

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

Есть ли простой способ сделать это?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 03 августа 2011

Это лучший способ для достижения этой цели.

Это определение команды:

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>
0 голосов
/ 27 июля 2011

Исходя из вашего вопроса, я полагаю, вы делаете это из 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...