0

我對ICommand的和RelayCommand何時使用ICommand包裝RelayCommand以及何時使用Just ReplayCommand?

有點糊塗如果我做這個自動完成控制

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似乎總是在構造函數中去。我可以將它粘在其他任何地方,因爲它會使構造函數非常混亂。

+1

您沒有綁定第一個示例中的命令,因此它不會觸發。無論您使用'ICommand'還是'RelayCommand <>',您都必須將其綁定到您的xaml中。 –

+0

RelayCommand與其他任何對象一樣。你可以在任何你想要的地方實例化它,但它需要被實例化,並且它需要綁定到你的XAML的某個地方。 – LBugnion

+0

@AlaaMasoud - 抱歉它實際上存在,但我想我沒有用「代碼格式化程序」突出顯示它,所以沒有顯示它。 – chobo2

回答

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; 

關於哪個更好:哪個更漂亮,紅髮,還是金髮? :)

相關問題