2016-03-21 10 views
3

Weiß jemand, warum mit dem MVVM Light RelayCommand generischen Typ würde seine canExecute immer auf false für die Bindung auflösen spezifisch sein? Um das richtige Verhalten zu erhalten, musste ich ein Objekt verwenden und es dann in den gewünschten Typ konvertieren.MVVM Light canExecute immer falsch mit RelayCommand <bool> nicht RelayCommand <object>

HINWEIS: canExecute wurde zu einem booleschen Wert zum Testen des Blocks, der nicht funktioniert, vereinfacht und ist normalerweise eine Eigenschaft CanRequestEdit.

funktioniert nicht:

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

Works:

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

Ich denke, dass CommandParameter als eine Zeichenfolge geht. – sexta13

+0

Sie sind korrekt, CommandParameter wird als Zeichenfolge ausgeführt. Wie denkst du, dass dies einen Einfluss auf canExecute haben würde, das fest codiert ist, um wahr zurückzugeben? – Rock

+0

seltsam ... können Sie versuchen, eine Funktion zu setzen? etwas wie: RelayCommand x = neu RelayCommand (req => {string s = "wahr";}, req => canExecute()); Private Bool canExecute() { Rückgabe True } – sexta13

Antwort

2

Blick auf the code for RelayCommand<T>, insbesondere die Linie markierte ich mit „!!!“:

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; 
} 

Der Parameter, den Sie Ihren Befehl sind vorbei ist der Zeichenfolge „true“, nicht die booleantrue, so wird der Zustand fehlschlagen weil parameter ist nicht null und die is Klausel ist falsch. Mit anderen Worten, wenn der Wert des Parameters nicht mit dem Typ T des Befehls übereinstimmt, wird false zurückgegeben.

Wenn Sie wirklich einen booleschen Code in Ihrem XAML codieren möchten (d. H. Ihr Beispiel ist kein Dummy-Code), dann suchen Sie unter this question nach Möglichkeiten.

+0

Vielen Dank für das Aufräumen! Nach genauem Hinsehen glaube ich, dass sexta13 sich entzogen hat, aber die ausführliche Antwort, die du zur Verfügung gestellt hast, ist korrekter. – Rock