2016-12-22 22 views
6

Tôi đang sử dụng thư viện MVVM Light. Từ thư viện này, tôi sử dụng RelayCommand<T> để xác định lệnh với đối số thuộc loại T.Làm cách nào để chuyển giá trị Nullable <Boolean> cho CommandParameter?

Bây giờ tôi đã xác định một RelayCommand mà đòi hỏi một đối số kiểu 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; 
     } 
    } 

Làm thế nào tôi có thể gán CommandParameter từ mã XAML của tôi?

Tôi đã cố gắng để vượt qua một giá trị boolean, nhưng điều đó gây ra ngoại lệ sau đây:

System.InvalidCastException: dàn diễn viên không hợp lệ từ 'System.Boolean' thành 'System.Nullable`1 [ [System.Boolean, mscorlib, Phiên bản = 4.0.0.0, Văn hóa = trung lập, PublicKeyToken = b77a5c561934e089]] '.

Tôi cũng đã cố gắng xác định các thuộc tính tĩnh có chứa bool? giá trị và tham chiếu chúng từ 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}" /> 

Nhưng điều này gây ra cùng một ngoại lệ được ném. Tôi cũng đã cố gắng trả lại new Nullable<bool>(true), nhưng như mong đợi, điều này có cùng kết quả.

+0

Bạn đã thấy điều này chưa? http://stackoverflow.com/questions/2850629/declare-a-nullable-int-int-using-xaml – tolanj

Trả lời

2

Có vẻ như MVVM Light có lỗi khi xử lý thông số khác nhau giữa ExecuteCanExecute và không xử lý không có giá trị theo cách phù hợp.

Xem mã tại https://github.com/paulcbetts/mvvmlight/blob/master/GalaSoft.MvvmLight/GalaSoft.MvvmLight%20(NET35)/Command/RelayCommandGeneric.cs#L198 dòng 198-205

gì xảy ra ở đó dẫn đến ngoại lệ của bạn và có thể dễ dàng sao chép với đoạn mã sau:

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

tôi nghi ngờ bạn chỉ có thể nộp một báo cáo lỗi , bởi vì bạn hoàn toàn có thể vượt qua tham số rỗng như tham số, nó được xử lý với lỗi.

+0

Cảm ơn! Điều đó thực sự gây ra vấn đề. Tôi đã gửi báo cáo lỗi: [link] (https://mvvmlight.codeplex.com/workitem/7742). – Chris

+0

Cùng một vấn đề ở đây 4 tháng sau đó. Dường như nó sẽ không được sửa chữa: ( – Speuline

+0

@Speuline Tôi không hoàn toàn chắc chắn liệu mã mà tôi tham chiếu trong câu hỏi có phản ánh thực hiện MVVM Light hiện tại hay không. Nhưng nếu bạn có được bàn tay của mình trên nguồn hiện tại và vấn đề là ở trong đó, bạn có thể tự khắc phục vấn đề và hài lòng với nó. – grek40

Các vấn đề liên quan