我对ICommand和RelayCommand感到有点困惑
如果我在自动完成控件上执行此操作
public RelayCommand<KeyEventArgs> AutoCompleteCommand
{
get;
private set;
}
public MyConstructor()
{
AutoCompleteCommand = new RelayCommand<KeyEventArgs>((e) =>
{
//Check if the key pressed is <Enter>
//if it is, check also if the SearchPropertyValue is not String.Empty then
var d = e;
//Should it return true or false?
});
}
在Xaml中:
<toolkit:AutoCompleteBox x:Name="acbStore" Margin="154,196,29,0" VerticalAlignment="Top" RenderTransformOrigin="0.6,0.083" Height="162"/>
<i:Interaction.Triggers>
<i:EventTrigger EventName="KeyDown">
<GalaSoft_MvvmLight_Command:EventToCommand Command="{Binding AutoCompleteCommand, Mode=OneWay}" PassEventArgsToCommand="True"/>
</i:EventTrigger>
</i:Interaction.Triggers>
什么都没发生。
如果我这样做
public ICommand AutoComplete
{
get
{
return new RelayCommand<KeyEventArgs>(e =>
{
var key = e.Key;
});
}
}
在Xaml中:
<i:Interaction.Triggers>
<i:EventTrigger EventName="KeyDown">
<GalaSoft_MvvmLight_Command:EventToCommand Command="{Binding AutoComplete, Mode=OneWay}"
PassEventArgsToCommand="True"/>
</i:EventTrigger>
</i:Interaction.Triggers>
<toolkit:AutoCompleteBox x:Name="acbStore" Margin="154,196,29,0"
VerticalAlignment="Top" RenderTransformOrigin="0.6,0.083" Height="162"/>
它可以工作,我的命令被触发了。
同样从我看到的所有示例中,RelayCommand似乎总是在构造函数中。我可以把它粘在其他任何地方,因为它会使构造函数非常混乱。
答案 0 :(得分:0)
关于这个问题,两者都应该真的有用。 (其中一条评论说它不是第一个例子中的约束,但你的代码暗示它是。 也许这与事情的确定有关? 在任何情况下,第二种方法每次调用都会返回一个新方法,这说起来有点老实......
关于在哪里做,你可以这样做。我见过两种主要方法:
第一个选项:
将私有ICommand作为属性,并在构造函数中定义:
ctor {
Cool_Command = new RelayCommand<EventArgs>(Execute_CoolCommand,
CanExecute_CoolCommand);
}
public ICommand Cool_Command { get; private set; }
第二个选项:
将它作为第一次调用时设置的属性。
public ICommand CoolAsWell_Command
{
get
{
return _coolAsWellCommand ??
(_coolAsWellCommand =
new RelayCommand<EventArgs>(Execute_CoolAsWell,
CanExecute_CoolAsWell));
}
private set { _coolAsWellCommand = value; }
}
private ICommand _coolAsWellCommand;
关于哪个更好:哪个更漂亮,红发或金发? :)