テキスト ボックスのテキストを 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;
}