2011-12-16 44 views
12

Tôi có phần tử Hình ảnh trong XAML. Tôi liên kết thuộc tính nguồn với thuộc tính chuỗi trong ViewModel của tôi. Tuy nhiên, đôi khi giá trị là null và sau đó tôi nhận được lỗi trong cửa sổ gỡ lỗi.Xử lý null khi liên kết với Hình ảnh trong XAML

Tôi đọc ở đây: ImageSourceConverter error for Source=null mà tôi có thể làm cho trình biến đổi trả về DependencyProperty.UnsetValue nếu giá trị là rỗng.

Bây giờ tôi tự hỏi liệu có thể thực hiện trực tiếp trong XAML không? Có lẽ bằng cách sử dụng một FallbackValue? Tôi đã thử một số biến thể nhưng không có may mắn.

Đây là yếu tố ảnh của tôi trong XAML:

<Image Name="img" Source="{Binding Path=CurrentImageSource}" Stretch="None" /> 

Và CurrentImageSource chỉ là một tài sản chuỗi trên DataContext.

Các thông báo lỗi là: System.Windows.Data Lỗi: 23:

Cannot convert '' from type '' to type 'System.Windows.Media.ImageSource' for 'sv-SE' culture with default conversions; consider using Converter property of Binding. NotSupportedException:'System.NotSupportedException: ImageSourceConverter cannot convert from (null).

Trả lời

16

Bạn có thể sử dụng một check for a null reference kích hoạt dữ liệu:

<Image Name="img" Stretch="None" > 
    <Image.Style> 
     <Style TargetType="{x:Type Image}"> 
      <Setter Property="Source" Value="{Binding CurrentImageSource}" /> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding CurrentImageSource}" Value="{x:Null}"> 
        <Setter Property="Source" Value="/ImageNullRef;component/errorImage.png" /> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </Image.Style> 
</Image> 

Trong khi nó không phải là có thể kiểm tra trực tiếp cho dù hai giá trị khác nhau, bạn có thể xem liệu giá trị lớn hơn hay nhỏ hơn, v.v. sử dụng this approach Mike Hillberg blogged about.

+0

Cảm ơn. Tôi đã hy vọng cho một số cú pháp đơn giản hơn (lika thiết lập một FallbackValue) nhưng tôi đoán nó không phải là có thể. –

14

tôi đã không kiểm tra nó, nhưng tôi nghĩ rằng đây là những gì TargetNullValue dành cho:

<Image Name="img" Source="{Binding Path=CurrentImageSource, TargetNullValue=/ImageNullRef;component/errorImage.png}" Stretch="None" /> 
+2

Đẹp nhất. Cắt và dán không hoàn toàn hiệu quả. Tôi cần tạo một tài nguyên hình ảnh ('') và sau đó tham khảo nó như vậy ' '. Câu trả lời hợp lệ và tôi đã học được điều gì đó -> +1 –

+0

Rất đẹp. Tôi thích điều này. +1 – cplotts

41

tôi đã sử dụng x: Null với TargetNullValue, như vậy bạn sẽ có được một hình ảnh trống dễ dàng ...

<Image Source="{Binding LogoPath, TargetNullValue={x:Null}}" /> 

Bằng cách đó bạn không cần phải gây rối với Triggers hoặc BitmapImages làm tài nguyên tĩnh.

0

Tôi chỉ kiểm tra câu trả lời của Sascha Hennig. Nó chạy tốt về phía tôi. Tôi chỉ sửa đổi một chút về phía mình (xóa /ImageNullRef; trong tài nguyên hình ảnh) <BitmapImage x:Key='defaultImage' UriSource='component/errorImage.png' />

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