【发布时间】:2013-06-04 20:41:04
【问题描述】:
我对 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 似乎总是在构造函数中。我可以将它粘贴在其他任何地方,因为它会使构造函数非常混乱。
【问题讨论】:
-
您没有在第一个示例中绑定命令,因此它不会触发。无论您使用
ICommand还是RelayCommand<>,您仍然需要在您的xaml 中绑定它。 -
RelayCommand 和其他对象一样是一个对象。你可以在任何你想要的地方实例化它,但它需要被实例化,并且它需要在某个地方绑定到你的 XAML。
-
@AlaaMasoud - 抱歉它确实存在,但我想我没有用“代码格式化程序”突出显示它,所以它没有被显示。
-
@LBugnion - 那么我应该将代码放在构造函数中的 RelayCommand 的 getter 中吗?
标签: windows-phone-7 mvvm-light silverlight-toolkit icommand relaycommand