Kezdőoldal » Számítástechnika » Programozás » Hogy működik a binding WPF-ben?

Hogy működik a binding WPF-ben?

Figyelt kérdés

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.)



2016. dec. 22. 11:21
 1/6 anonim ***** válasza:
DataContext-et hogy/hol allitod be?
2016. dec. 22. 11:57
Hasznos számodra ez a válasz?
 2/6 A kérdező kommentje:
Sehol. Azt hittem, hogy ha egyszer csak egy property-re bindingolnék akkor nem kell ilyen. És a netes példákban sem látok sehol ilyet.
2016. dec. 22. 15:01
 3/6 anonim ***** válasza:
100%
Amikor létrehozod a nézeted, meg kell adni neki egy DataContext-et, azaz egy objektumot, aminek a propertyjeit bindolod. Fontos, hogy olyan objektumra kösd rá, aminek az osztálya implementálja az INotifyPropertyChanged interfészt, különben nem fogja tudni jelezni a nézetnek, ha egy-egy property megváltozott.
2016. dec. 22. 22:38
Hasznos számodra ez a válasz?
 4/6 anonim ***** válasza:

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. )

2016. dec. 29. 00:13
Hasznos számodra ez a válasz?
 5/6 anonim ***** válasza:

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.

2016. dec. 30. 15:03
Hasznos számodra ez a válasz?
 6/6 A kérdező kommentje:

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!

2017. jan. 1. 03:21

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

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!