1

我正在尝试将文本框文本绑定到命令参数。但是在调用 CanExecute 时,传递的参数为空。更改文本也不会调用 CanExecute。

我的用例有效吗?

看法

<Window x:Class="PlayButtonCommandParameter.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:playButtonCommandParameter="clr-namespace:PlayButtonCommandParameter"
        Title="MainWindow" Height="350" Width="525">
  <Window.Resources>
    <playButtonCommandParameter:TestViewModel x:Key="vm"/>
  </Window.Resources>
    <StackPanel DataContext="{StaticResource vm}">
      <TextBox Name="Test">Hello</TextBox>
      <Button Content="Element Name Click" 
              Command="{Binding TestCommand}" 
              CommandParameter="{Binding ElementName=Test, Path=Text}"></Button>
      <Button Content="RelativeSource Click" 
              Command="{Binding RelativeSourceCommand}" 
              CommandParameter="{Binding 
                                  RelativeSource={RelativeSource AncestorType=StackPanel}, 
                                  Path=Children[0].Text}"></Button>
    </StackPanel>
</Window>

视图模型

public class TestViewModel : INotifyPropertyChanged
{
    private readonly ICommand testCommand = new TestCommand();

    public ICommand TestCommand
    {
        get { return testCommand; }
    }

    private readonly ICommand relativeSourceCommand = new TestCommand();

    public ICommand RelativeSourceCommand
    {
        get { return relativeSourceCommand; }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    [NotifyPropertyChangedInvocator]
    protected virtual void OnPropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
    }
}

命令

public class TestCommand : ICommand
{
    public void Execute(object parameter)
    {
        Clipboard.SetData(DataFormats.Text, parameter);
    }

    public bool CanExecute(object parameter)
    {
        var text = parameter as string;

        return !string.IsNullOrEmpty(text);
    }

    public event EventHandler CanExecuteChanged;
}
4

1 回答 1

2

不,您的期望是无效的。第一的:

更改文本也不会调用 CanExecute

CanExecute除非您在 ICommand 中触发CanExecuteChanged事件,否则没有人会调用您的处理程序。在您的情况下,您将必须自己处理TextBox TextChanged事件并CanExecuteChanged在您的ICommand实施中提出。

对于这个简单的情况,我建议您改用 a 的实例RoutedCommand。有一个 CommandManager 可以侦听 UI 中的更改并CanExecuteChanged为您引发事件。

只需按照以下简单步骤如何:创建 RoutedCommand

于 2013-11-29T11:09:58.663 回答