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ò esserenull
o vuoto""
. Funzionerebbe un personaggio singolo"x"
o uno spazio" "
. - Se si esegue il binding a
BitmapImage
, restituirenull
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));
}
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. –
@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 –
@igrali, sembra che non abbia nemmeno bisogno di un uri valido, a patto che non sia vuoto, non genererà errori in fase di compilazione! –