2015-08-08 10 views
13

In XAML Ho la seguente linea:x: Immagine Bind con stringa nulla

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

In ViewModel:

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

App compila bene, ma durante l'esecuzione (in quanto dati è popolata dopo pochi secondi) , l'app si arresta in modo anomalo con la seguente eccezione:

System.ArgumentException: il parametro non è corretto. pause

Debugger a:

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

Apparentemente, questo si verifica in quanto mainpic sta tornando nullo.

Ora, questo codice funziona correttamente in WP8.1. Ho provato a restituire uri che risulta in errore di compilazione. Credo che solo la stringa possa essere vincolata alla sorgente di immagini in Win 10 (?) Voglio solo un'area bianca vuota fino a quando i dati non vengono compilati, quindi non voglio dare una fonte di immagine locale come fallback. Qualcuno può aiutarmi a portare questo per Win 10?


UPDATE:

Grazie agli utenti che hanno risposto, questa conclusione è tratto (per UWP):

  • Se stai vincolante sorgente di immagini ad un string, non può essere null o vuoto "". Funzionerebbe un personaggio singolo "x" o uno spazio " ".
  • Se si esegue il binding a BitmapImage, restituire null funziona.
  • È possibile utilizzare uno dei metodi menzionati da @ Justin-xl. Per me, cambiare tutti i vm per smettere di restituire null era difficile. Quindi aggiungere un semplice convertitore a xaml fa anche il trucco.

Ecco il codice del convertitore:

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

risposta

14

Se si utilizza x:Bind, il Source dei Image bisogno di legarsi a una proprietà dello stesso tipo esatto ImageSource (ad es BitmapImage) invece di string, altrimenti genererà un errore in fase di compilazione, che è esattamente un legame in fase di compilazione dovrebbe fare. Il vecchio binding consente alle stringhe perché utilizza Reflection per risolvere il tipo durante l'esecuzione.

Si scopre che la mia teoria del tipo esplicito era sbagliata (grazie a @igrali per averlo indicato). Lo Source ha un numero di telefono pari a string, a condizione che non sia null o ''. Quindi ci lascia due opzioni per risolvere questo problema.

Opzione 1

Mantenere il vostro uri come string, ma fare un controllo nella vostra vm, una volta che è null o '', tornare un testo fittizio (anche la restituzione di un una lettera x avrebbe funzionato!).

Opzione 2

Modificare il uri da una stringa di ad un BitmapImage. Quindi è possibile utilizzare TargetNullValue e FallbackValue per gestire i valori null e i collegamenti non validi.

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

Anche se in questo caso particolare, la stringa nulla sta causando problemi, tecnicamente, utilizzando {x: Bind} di legarsi le stringhe con un'immagine valida Uris sarà ancora lavorare. –

+0

@igrali sai cosa, l'ho appena testato e non hai ragione! Interessante anche se ha bisogno di un ** url ** valido altrimenti genererà un errore in fase di compilazione. Aggiornerò la risposta –

+1

@igrali, sembra che non abbia nemmeno bisogno di un uri valido, a patto che non sia vuoto, non genererà errori in fase di compilazione! –

Problemi correlati