2016-03-21 95 views
3

有誰知道爲什麼使用MVVM Light RelayCommand通用類型會導致其canExecute始終解析爲綁定錯誤?爲了獲得正確的行爲,我必須使用一個對象,然後將其轉換爲所需的類型。MVVM Light canExecute始終爲false,並且RelayCommand <bool> not RelayCommand <object>

注意:canExecute被簡化爲布爾值來測試不起作用的塊,通常是屬性CanRequestEdit。

不起作用:

public ICommand RequestEditCommand { 
    get { 
    return new RelayCommand<bool>(commandParameter => { RaiseEventEditRequested(this, commandParameter); }, 
            commandParameter => { return true; }); 
    } 
} 

作品:

public ICommand RequestEditCommand { 
    get { 
    return new RelayCommand<object>(commandParameter => { RaiseEventEditRequested(this, Convert.ToBoolean(commandParameter)); }, 
            commandParameter => { return CanRequestEdit; }); 
    } 
} 

XAML:

<MenuItem Header="_Edit..." Command="{Binding RequestEditCommand}" CommandParameter="true"/> 
+1

我認爲CommandParameter是作爲一個字符串。 – sexta13

+0

你是正確的,CommandParameter是作爲一個字符串。你如何認爲這會對canExecute產生影響,而硬編碼會返回true? – Rock

+0

奇怪......你可以嘗試放入一個函數嗎?例如: RelayCommand x = new RelayCommand (req => {string s =「true」;},req => canExecute()); private bool canExecute() { return true } – sexta13

回答

2

the code for RelayCommand<T>,特別是我行標有「!!!」:

public bool CanExecute(object parameter) 
{ 
    if (_canExecute == null) 
    { 
     return true; 
    } 

    if (_canExecute.IsStatic || _canExecute.IsAlive) 
    { 
     if (parameter == null 
#if NETFX_CORE 
      && typeof(T).GetTypeInfo().IsValueType) 
#else 
      && typeof(T).IsValueType) 
#endif 
     { 
      return _canExecute.Execute(default(T)); 
     } 

     // !!! 
     if (parameter == null || parameter is T) 
     { 
      return (_canExecute.Execute((T)parameter)); 
     } 
    } 

    return false; 
} 

要傳遞到您的命令的參數是字符串「真」,而不是布爾true,所以病情會失敗因爲parameter不是nullis子句是錯誤的。換句話說,如果參數的值與該命令的類型T不匹配,則它返回false

如果您確實想要將布爾值硬編碼到您的XAML中(即您的示例不是虛擬代碼),請參閱this question以瞭解如何執行此操作。

+0

謝謝你清理那個!經過仔細觀察,我相信這是sexta13所避免的,但您提供的詳細答案更正確。 – Rock

相關問題