2016-12-22 3 views
6

Ich verwende die MVVM Light-Bibliothek. Aus dieser Bibliothek verwende ich RelayCommand<T>, um Befehle mit einem Argument vom Typ T zu definieren.Wie übergebe ich Nullable <Boolean> Wert an CommandParameter?

Jetzt habe ich eine RelayCommand definiert, die ein Argument vom Typ erfordert Nullable<bool>:

Wie kann ich ordnen Sie die Commandparameter aus meiner XAML-Code

private RelayCommand<bool?> _cmdSomeCommand; 
    public RelayCommand<bool?> CmdSomeCommand 
    { 
     get 
     { 
      if (_cmdSomeCommand == null) 
      { _cmdSomeCommand = new RelayCommand<bool?>(new Action<bool?>((val) => { /* do work */ })); } 
      return _cmdSomeCommand; 
     } 
    } 
?

Ich habe versucht, einen Booleschen Wert zu übergeben, aber das bewirkt, dass die folgende Ausnahme:

System.InvalidCastException: Ungültige Umwandlung von 'System.Boolean' auf ‚System.Nullable`1 [ [System.Boolean, mscorlib, Version = 4.0.0.0, Kultur = neutral, PublicKeyToken = b77a5c561934e089]] '.

Ich habe auch versucht, statische Eigenschaften zu definieren, die das Bool enthalten? sie von XAML-Werte und Referenz:

public static class BooleanHelper 
{ 
    public static bool True { get { return true; } } 
    public static bool False { get { return false; } } 

    public static bool? NullableTrue { get { return true; } } 
    public static bool? NullableFalse { get { return false; } } 
} 

XAML:

<Button Command="{Binding CmdSomeCommand}" CommandParameter="{x:Static my:BooleanHelper.NullableTrue}" /> 

Aber dies bewirkt, dass die gleiche Ausnahme ausgelöst werden. Ich habe auch versucht, new Nullable<bool>(true) zurückgeben, aber wie erwartet, hat dies das gleiche Ergebnis.

+0

Haben Sie das gesehen? http://stackoverflow.com/questions/2850629/declare-a-nullable-int-int-using-xaml – tolanj

Antwort

2

Es sieht so aus, als ob MVVM Light den Parameter zwischen Execute und CanExecute unterschiedlich behandelt und die NULL-Verarbeitung nicht korrekt verarbeitet.

Sehen Sie den Code in https://github.com/paulcbetts/mvvmlight/blob/master/GalaSoft.MvvmLight/GalaSoft.MvvmLight%20(NET35)/Command/RelayCommandGeneric.cs#L198 Linien 198-205

Was Ihre Ausnahme geschieht dort führt und kann leicht mit dem folgenden Code wiedergegeben werden:

object t1 = (bool?)true; 
// issue: for Nullable<T>, GetType will return T 
if (t1.GetType() != typeof(bool?)) 
{ 
    if (t1 is IConvertible) 
    { 
     var val = Convert.ChangeType(t1, typeof(bool?), null); 
    } 
} 

Ich vermute, Sie können nur einen Fehlerbericht , weil Sie den Nullwert als Parameter mit fehlerfrei verarbeiten können.

+0

Vielen Dank! Das verursacht tatsächlich das Problem. Ich habe einen Fehlerbericht eingereicht: [link] (https://mvvmlight.codeplex.com/workitem/7742). – Chris

+0

Das gleiche Problem hier 4 Monate später. Es scheint nicht, dass es korrigiert wird :( – Speuline

+0

@Speuline Ich bin nicht ganz sicher, ob der Code, den ich in der Frage referenzierte, die aktuelle Implementierung von MVVM Light widerspiegelt. Aber wenn Sie die aktuelle Quelle und die Problem ist darin, Sie können nur das Problem selbst beheben und damit zufrieden sein. – grek40

Verwandte Themen