1

テキスト ボックスのテキストを Commandparameter にバインドしようとしています。ただし、CanExecute の呼び出しでは、渡されたパラメーターは null です。テキストを変更しても、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 は呼び出されません

ICommand でイベントを発生さCanExecuteせない限り、誰もあなたのハンドラーを呼び出すことはありません。CanExecuteChangedあなたの場合、TextBox TextChangedイベントを自分で処理し、実装CanExecuteChanged内で from を発生させる必要がありますICommand

この単純なケースでは、代わりに a のインスタンスを使用することをお勧めしますRoutedCommand。UI の変更をリッスンし、イベントを発生させる CommandManager がありCanExecuteChangedます。

次の簡単な手順に従ってください。方法: RoutedCommand を作成する

于 2013-11-29T11:09:58.663 に答える