2015-08-08 18 views
13

Trong XAML Tôi có dòng sau:x: image Bind với chuỗi rỗng

<Image x:Name="MainImage" 
     Source="{x:Bind ViewModel.MainPic,Mode=OneWay,TargetNullValue={x:Null}}" 
     Stretch="UniformToFill"/> 

Trong ViewModel:

public string MainPic 
{ 
    get 
    { 
     if (Data == null) 
      return default(string); 
     else 
      return Data.Photos.ElementAtOrDefault(0).url; 
    } 
} 

App biên dịch tốt nhưng trong quá trình thực hiện (kể từ khi dữ liệu được phổ biến sau vài giây) , ứng dụng gặp sự cố với ngoại lệ sau:

System.ArgumentException: Tham số không chính xác. phá vỡ

Debugger tại địa chỉ:

  private void Update_ViewModel_MainPic(global::System.String obj, int phase) 
      { 
       if((phase & ((1 << 0) | NOT_PHASED | DATA_CHANGED)) != 0) 
       { 
/*HERE>>*/   XamlBindingSetters.Set_Windows_UI_Xaml_Controls_Image_Source(this.obj23, (global::Windows.UI.Xaml.Media.ImageSource) global::Windows.UI.Xaml.Markup.XamlBindingHelper.ConvertValue(typeof(global::Windows.UI.Xaml.Media.ImageSource), obj), null); 
       } 
      } 

Rõ ràng, điều này xảy ra kể từ khi MainPic đang trở lại null.

Bây giờ, mã này hoạt động tốt trong WP8.1. Tôi đã cố gắng trả lại uri mà kết quả trong thời gian biên dịch lỗi. Tôi tin rằng chỉ có chuỗi có thể được liên kết với nguồn hình ảnh trong Win 10 (?) Tôi chỉ muốn một khu vực trắng trống cho đến khi dữ liệu được dân cư vì vậy tôi không muốn cung cấp cho một nguồn hình ảnh địa phương như dự phòng. Ai đó có thể giúp tôi cổng này cho Win 10?


UPDATE:

Nhờ những người dùng trả lời, kết luận sau đây được rút ra (ví UWP):

  • Nếu bạn đang ràng buộc nguồn hình ảnh đến một string, nó có thể không là null hoặc trống "". Một ký tự singe "x" hoặc một không gian " " sẽ hoạt động.
  • Nếu bạn liên kết với một số BitmapImage, hãy trả lại null hoạt động.
  • Bạn có thể sử dụng bất kỳ phương pháp nào được đề cập bởi @ Justin-xl. Đối với tôi, thay đổi tất cả các vm để ngừng trả về null là khó. Vì vậy, thêm một đơn giản chuyển đổi để xaml cũng không lừa.

Dưới đây là đoạn code Chuyển đổi:

public object Convert(object value, Type targetType, object parameter, string language) 
{ 
    if (string.IsNullOrEmpty(value as string)) 
    { 
     return null; 
    } 
    else return new BitmapImage(new Uri(value as string, UriKind.Absolute)); 
} 

Trả lời

14

Nếu bạn sử dụng x:Bind, các Source của Image nhu cầu liên kết với một tài sản cùng loại chính xác ImageSource (ví dụ BitmapImage) thay vì string, nếu không nó sẽ ném một lỗi biên dịch thời gian, mà chính xác là một ràng buộc thời gian biên dịch là nghĩa vụ phải làm. Các ràng buộc cũ cho phép dây vì nó sử dụng Phản ánh để giải quyết loại cho bạn trong thời gian chạy.

Biến lý thuyết loại rõ ràng của tôi sai (nhờ @igrali để chỉ ra nó). Các Source không mất string miễn là nó không phải là null hoặc ''. Vì vậy, nó để lại cho chúng tôi hai lựa chọn để sửa lỗi này.

Lựa chọn 1

Giữ bạn uri như một string, nhưng làm một kiểm tra trong vm của bạn, khi nó đã null hoặc '', trở về một số văn bản dummy (thậm chí trả lại một thư x sẽ làm việc!).

Lựa chọn 2

Thay đổi uri từ một chuỗi đến một BitmapImage. Sau đó, bạn có thể sử dụng TargetNullValueFallbackValue để xử lý các giá trị rỗng và các ràng buộc không hợp lệ.

... FallbackValue='http://Assets/SplashScreen.png' TargetNullValue='http://Assets/SplashScreen.png'}" 
+1

Mặc dù trong trường hợp cụ thể, chuỗi rỗng đang gây ra sự cố, về mặt kỹ thuật, sử dụng {x: Bind} để liên kết với chuỗi có hình ảnh hợp lệ Uris sẽ vẫn hoạt động. –

+0

@igrali bạn biết không, tôi vừa kiểm tra nó n quyền của bạn! Thú vị mặc dù nó cần một ** ** hợp lệ url nếu không nó sẽ ném một lỗi thời gian biên dịch. Tôi sẽ cập nhật câu trả lời. –

+1

@igrali, có vẻ như nó thậm chí không cần một uri hợp lệ, miễn là nó không có sản phẩm nào, nó sẽ không ném lỗi thời gian biên dịch! –

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