我正在尝试将文本框文本绑定到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>
ViewModel
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;
}
更改文本也不会调用CanExecute
除非在ICommand中激发CanExecuteChanged
事件,否则没有人会调用CanExecute
处理程序。在您的情况下,您将不得不自己处理TextBox
TextChanged
事件,并从ICommand
实现中引发CanExecuteChanged
。
对于这种简单的情况,我建议您使用RoutedCommand
的实例。有一个CommandManager可以侦听UI中的更改,并为您引发CanExecuteChanged
事件。
只需遵循以下简单步骤如何:创建RoutedCommand