【问题标题】:When To Use ICommand Wrapped With RelayCommand and when to use Just ReplayCommand?何时使用 RelayCommand 封装的 ICommand 以及何时使用 Just ReplayCommand?
【发布时间】: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&lt;&gt;,您仍然需要在您的xaml 中绑定它。
  • RelayCommand 和其他对象一样是一个对象。你可以在任何你想要的地方实例化它,但它需要被实例化,并且它需要在某个地方绑定到你的 XAML。
  • @AlaaMasoud - 抱歉它确实存在,但我想我没有用“代码格式化程序”突出显示它,所以它没有被显示。
  • @LBugnion - 那么我应该将代码放在构造函数中的 RelayCommand 的 getter 中吗?

标签: windows-phone-7 mvvm-light silverlight-toolkit icommand relaycommand


【解决方案1】:

关于这个问题,两者都应该真正起作用。 (其中一个 cmets 说它在第一个示例中不受约束,但您的代码表明它是。 也许这与事物的设置方式有关? 无论如何,第二种方法每次调用都会返回一个新方法,老实说,这闻起来有点……

关于在哪里做,你可以做任何一种方式。我见过两种主要方法:

第一个选项:
有一个私有的 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;

关于哪个更好:哪个更漂亮、红发还是金发? :)

【讨论】:

    猜你喜欢
    • 2014-08-13
    • 2021-09-20
    • 2012-03-13
    • 2015-01-07
    • 2016-09-23
    • 2021-02-09
    • 2019-08-12
    • 1970-01-01
    相关资源
    最近更新 更多