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 funkcjanull
. - 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));
}
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ć. –
@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ź. –
@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! –