Hogy működik a binding WPF-ben?
Már egy napja nézegetem és nem tudok rájönni.
Az elképzelésem ez volt először:
<ActivityIndicator x:Name="ActivityInd" IsRunning="{Binding IsLoading}" IsVisible="{Binding IsLoading}" Color="White"/>
És akkor az ehhez a xaml-hez tartozó .cs-ben lenne egy ilyen:
public bool IsLoading { get; set; }
És ahogy a kódban állítgatom a propertyt, változik az ActivityIndicator láthatósága, meg az IsRunning-ja. Viszont nem működik, nem csinál igazából semmit.
A másik próbálkozásom:
<ActivityIndicator x:Name="ActivityInd" Color="White"/>
A .cs-ben pedig:
public bool IsLoading { get; set; }
ActivityInd.SetBinding(ActivityIndicator.IsVisibleProperty, new Binding("IsLoading", BindingMode.TwoWay, null, null, null, this));
ActivityInd.SetBinding(ActivityIndicator.IsRunningProperty, new Binding("IsLoading", BindingMode.TwoWay,null, null, null, this));
Ez ugyan úgy nem működik. Amikor beállítom az IsLoadingot true-ra, akkor tényleg megjelenik az elem, viszont false után nem tűnik el.
Hogy kéne ezt megoldani? Ezer megoldást láttam a neten, de egyik se ment.
(Annyi megjegyzés, hogy Xamarin.Forms projekt ez igazából, de itt is ugyan úgy kéne ennek működnie mint WPF-ben, amivel eddig sajnos nem foglalkoztam, ez is ugyan úgy axml-t használ az UI-ra.)
Tudom, hogy késő már, de azzal kiegészíteném, ami először sok gondot szokott okozni:
Listára nem tudsz rendesen bindolni, használj ObservableCollection-t. A lista nem értesít ha megváltozott a tartalma, és elsütheted kézzel, de minek ha ott az egyszerűbb megoldás. (+tipp: Az ObservableCollection sem sül el ha a referenciát magát változtatod meg (lista = x), csak ha az elemeket. )
Igen, mint a #3-as is mondta, a WPF feliratkozik a property-k propertychanged event-jére, és várja, hogy mikor sülnek el, akkor frissíti a megjelenített adatot. (Ld. a xaml-ból generált NézetNeve.g.i.cs állomány. Megnyitható pl. a VS Go To Definition... segítségével, illetve kézileg az obj\Debug-ban találod fordítás után)
Az INotifyPropertyChanged lényege, hogy van egy OnPropertyChanged esemény rajta, amit elsütsz, ha változik a property. Mivel ez ún. Boiler-plate kód, ezért hasznos, ha csinálsz egy ilyen ősosztályt, amiből az összes nézet-modelled származni fog.
Listáról szó se volt, ott tudom, hogy ObservableCollection-t kellene használni vagy BindingList-et.
Az INotifyPropertyChanged volt az ami nálam hiányzott. Én csak xaml-ben hozzákötöttem egy public propertyhez az aktuális dolgot és vártam a csodát, nem tudtam hogy ehhez kéne ilyen is :D Azért köszi!
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!