2011-12-16 8 views
12

Mam element obrazu w XAML. Łączę właściwość Source z właściwością string w moim ViewModel. Jednak czasami wartość jest pusta, a następnie pojawiają się błędy w oknie debugowania.Obsługa wartości null podczas wiązania z obrazem w XAML

Przeczytałem tutaj: ImageSourceConverter error for Source=null, że mogę zrobić konwerter, aby zwrócić DependencyProperty.UnsetValue, jeśli wartość jest zerowa.

Teraz zastanawiam się, czy można to zrobić bezpośrednio w XAML? Być może używając FallbackValue? Próbowałem niektórych wariantów, ale bez powodzenia.

To jest mój żywioł Obraz w XAML:

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

I CurrentImageSource jest tylko właściwość ciąg na DataContext.

Komunikat o błędzie jest: System.Windows.Data Error: 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).

Odpowiedz

16

Można check for a null reference przy użyciu wyzwalacza danych:

<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> 

Mimo, że nie jest możliwe, aby przetestować bezpośrednio czy dwie wartości różnią się, można zobaczyć, czy wartość jest większa lub mniejsza, itp. przy użyciu this approach Mike Hillberg blogged about.

+0

Dzięki. Miałem nadzieję na prostszą składnię (lika ustawia FallbackValue), ale myślę, że to niemożliwe. –

14

nie testowałem, ale myślę, że to, co jest dla TargetNullValue:

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

Niezły. Wycinanie i wklejanie nie działały. Musiałem utworzyć zasób obrazu (''), a następnie odwołać go tak, jak to " '. Poprawna odpowiedź i dowiedziałem się czegoś -> +1 –

+0

Bardzo ładne. Lubię to. +1 – cplotts

41

użyłem X: null z TargetNullValue, w ten sposób można uzyskać łatwy pusty obraz ...

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

W ten sposób nie musisz się bawić wyzwalaczami ani BitmapImages jako zasobami statycznymi.

0

Właśnie sprawdzam odpowiedź Saschy Hennig. Działa dobrze po mojej stronie. Po prostu mam małą modyfikację po mojej stronie (usuń /ImageNullRef; w zasobie obrazu) <BitmapImage x:Key='defaultImage' UriSource='component/errorImage.png' />

Powiązane problemy