2015-08-08 8 views
13

w XAML Mam następujący wiersz:x: Bind obraz z łańcuchem pustym

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

W ViewModel:

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

App kompiluje w porządku, ale w trakcie realizacji (ponieważ dane są wypełniane po kilku sekundach) , aplikacja ulega awarii z następującym wyjątkiem:

System.ArgumentException: Parametr jest niepoprawny. przerwy

Debugger na:

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

Najwyraźniej tak się dzieje ponieważ mainpic zwraca wartość null.

Teraz ten kod działa poprawnie w WP8.1. Próbowałem zwracać uri, co powoduje błąd czasu kompilacji. Wierzę, że tylko ciąg może być powiązany ze źródłem obrazu w Win 10 (?) Po prostu chcę pusty biały obszar do momentu zapełnienia danych, dlatego nie chcę podawać lokalnego źródła obrazu jako rezerwowego. Czy ktoś może mi pomóc w przeniesieniu tego na Win 10?


UPDATE:

Dzięki użytkownikom, którzy odpowiedzieli, po wniosek został sporządzony (dla UWP):

  • Jeśli wiążące źródło obrazu do string, nie może być null lub pusty "". Pojedynczy znak "x" lub przestrzeń " " zadziała.
  • Po powiązaniu z BitmapImage powraca funkcja null.
  • Można użyć dowolnej z metod wymienionych przez @ Justin-xl. Dla mnie zmiana wszystkich vm w celu zatrzymania zwracania wartości NULL była trudna. Dodanie prostego konwertera do Xaml również działa.

Oto kod konwerter:

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

Odpowiedz

14

Jeśli używasz x:Bind The Source z Image potrzeb wiążą się własność dokładnie tego samego typu ImageSource (np BitmapImage) zamiast string, inaczej wywoła to błąd kompilacji, który powinien być wykonywany w czasie kompilacji. Stare powiązanie zezwala na ciągi , ponieważ używa Reflection, aby rozwiązać typ dla ciebie podczas pracy.

Okazało się, że moja teoria typu jawnego była błędna (dzięki @igrali za wskazanie). Model Source zajmuje string, o ile nie jest to null lub ''. Pozostawia nam dwie opcje, aby to naprawić.

Wariant 1

Trzymaj uri jako string, ale zrobić test w swojej vm po to null lub '', zwrócić obojętne tekst (nawet odesłanie do nas x będzie działać!).

Wariant 2

Zmiana uri od A ciąg Do BitmapImage. Następnie można użyć wartości TargetNullValue i do obsługi wartości null i nieprawidłowych powiązań.

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

Choć w tym konkretnym przypadku łańcuchem pustym jest przyczyną problemów, technicznie, używając {} x: Bind do wiązania sznurków z prawidłowym obrazem Uris będzie nadal działać. –

+0

@igrali wiesz co, właśnie przetestowałem to n twoje prawo! Interesujące, chociaż musi ** ** poprawny adres URL, w przeciwnym razie spowoduje błąd podczas kompilacji. Zaktualizuję odpowiedź. –

+1

@igrali, wygląda na to, że nie potrzebuje nawet prawidłowej nazwy URI, o ile nie jest pusta, nie będzie wyświetlać błędów podczas kompilacji! –