2016-12-22 58 views
6

Używam biblioteki MVVM Light. Z tej biblioteki używam RelayCommand<T> do definiowania poleceń z argumentem typu T.Jak przekazać wartość Nullable <Boolean> do CommandParameter?

Teraz zdefiniowano RelayCommand która wymaga argumentu typu Nullable<bool>:

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

Jak mogę przypisać CommandParameter z mojego kodu XAML?

Starałem się przekazać wartość logiczną, ale to powoduje następujący wyjątek:

System.InvalidCastException: Nieprawidłowy obsady z 'System.Boolean' do „System.Nullable`1 [ [System.Boolean, mscorlib, wersja = 4.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089]] '.

Próbowałem również zdefiniować właściwości statyczne zawierające bool? Wartości i odwoływać się do nich z XAML:

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}" /> 

Ale to powoduje ten sam wyjątek do rzucania. Próbowałem również zwrócić new Nullable<bool>(true), ale zgodnie z oczekiwaniami ma to ten sam wynik.

+0

Widziałeś to? http://stackoverflow.com/questions/2850629/declare-a-nullable-int-int-using-xaml – tolanj

Odpowiedz

2

Wygląda na to, że MVVM Light jest w błędzie za obsługę parametru w różny sposób między Execute a CanExecute i nie radzi sobie z zerowaniem w odpowiedni sposób.

Zobacz kod na https://github.com/paulcbetts/mvvmlight/blob/master/GalaSoft.MvvmLight/GalaSoft.MvvmLight%20(NET35)/Command/RelayCommandGeneric.cs#L198 Lines 198-205

co tam się dzieje prowadzi do wyjątku i mogą być łatwo powielane z następującego kodu:

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

podejrzewam można tylko złożyć raport o błędzie , ponieważ można perfekcyjnie przekazać wartość nullable jako parametr, jest obsługiwany z błędami.

+0

Dzięki! To naprawdę powoduje problem. Złożyłem raport o błędzie: [link] (https://mvvmlight.codeplex.com/workitem/7742). – Chris

+0

Ten sam numer tutaj 4 miesiące później. Wygląda na to, że nie będzie to poprawione :( – Speuline

+0

@Speuline Nie jestem do końca pewien, czy kod, do którego się odwołałem, odzwierciedla bieżącą implementację MVVM Light, ale jeśli dostaniesz w swoje ręce obecne źródło i Problem polega na tym, możesz sam rozwiązać problem i być z niego zadowolony. – grek40