CheckBox - wiązanie dwukierunkowe.

CheckBox - wiązanie dwukierunkowe.
HI
  • Rejestracja:prawie 13 lat
  • Ostatnio:około 15 godzin
  • Postów:1857
0

Witam.

Czy w WindowsForms da się zrobić wiązanie dwukierunkowe z CheckBoxem?

Chce wrzucić na formę kilka CheckBoxów i powiązać je ze zmiennymi w ten sposób, aby w chwili zmiany wartości właściwości zmieniał się również stan kontrolek (pojawiał się/znikał "ptaszek").

O ile w drugą stronę (na podstawie kliknięć użytkownika zmieniać wartość właściwości) nie ma problemu, to coś takiego mi nie wychodzi...

edytowany 1x, ostatnio: hipekk
Tobiasz Stamborski
  • Rejestracja:ponad 4 lata
  • Ostatnio:około rok
  • Postów:16
0

no masz w c# takie coś jak akcesory i do tego to właśnie służy żeby zrobić coś
przy okazji samej zmiany wartości zmiennej. Piszesz sobie np.:

Kopiuj
public bool Zmienna1
{
	get
	{
		return _Zmienna1;
	}
	set
	{
		checkBox1.Checked = value;
		_Zmienna1 = value;
	}
}
AK
  • Rejestracja:prawie 7 lat
  • Ostatnio:około miesiąc
  • Postów:3561
0
Tobiasz Stamborski napisał(a):

no masz w c# takie coś jak akcesory i do tego to właśnie służy żeby zrobić coś
przy okazji samej zmiany wartości zmiennej. Piszesz sobie np.:

Kopiuj
public bool Zmienna1
{
	get
	{
		return _Zmienna1;
	}
	set
	{
		checkBox1.Checked = value;
		_Zmienna1 = value;
	}
}
  1. Niekoniecznie to ładne, z Modelu zygać do GUI

  2. Warto dać aplikacji troszkę czasu na odświeżenie widgetów
    Application.DoEvents()

  3. Żeby nie gwałcić GUI z Modelu, a zrobić to ładnie, klasę Modelu się z czegoś dziedziczyło, a na property dawało atrybut chyba z grupy ComponentModel. powodowało to, że GUI było "bardziej zainteresowane" śledzeniem zmian na właściwościach.
    Niestey na kolanie sobie nie przypomnę. Jak mnie oświeci, to dopiszę.


Bo C to najlepszy język, każdy uczeń ci to powie
Tobiasz Stamborski
pewnie że można to zrobić lepiej, ale ja chciałem tylko tak najprościej/najkrócej aby działało
KA
Oświecam :inotifypropertychanged :)
AdamWox
  • Rejestracja:ponad 7 lat
  • Ostatnio:około 2 godziny
  • Lokalizacja:Jastrzębie-Zdrój
  • Postów:2161
1

Wszyscy od razu zaatakowali gościa MVVM, bo tak się powinno robić, a autorowi chodzi o zwykły refresh kontrolek :D Przykład z głowy:

Kopiuj
//Przykładowa klasa

class MojObiekt 
{
	public bool Wartosc1 {get;set}
	public bool Wartosc2 {get;set;}
}

// Robisz sobie metodę, która po każdej zmianie obiektu odświeża GUI

public void RefreshGUI(MojObiekt obiekt)
{
	checkBox1.Checked = obiekt.Wartosc1;
	checkBox2.Checked = obiekt.Wartosc2;
}

To jest tragiczne rozwiązanie, ale wnoszę, że właśnie o to chodziło. W momencie kiedy będziesz zmieniał w kodzie wartość obiektu wywołujesz RefreshGUI(mojObjekt). Oczywiście nazewnictwo musisz dopasować do siebie. Nawet ciężko wywnioskować do czego takie coś się przyda, ale nie drążę ;-)

HI
No właśnie chodziło raczej o coś w styku MVVM, dlatego napisałem o wiązaniu :).
Tobiasz Stamborski
prawdę mówiąc też podejrzewam że hipekk niekoniecznie musi wgl używać czegoś takiego MVVM i chodzi mu o prosty problem
KA
  • Rejestracja:ponad 4 lata
  • Ostatnio:około 3 godziny
  • Postów:49
1

Twoje GUI musi wiedzieć o tym że properta została zmieniona i wywołać reakcje na to zdarzenie.
W twoim wypadku będzie to zaptaszenie/odptaszenie checkboxa
aby to zrobić należy do zmiany prop dowiązać Interfejs INotifypropertyChanged
Guide od M$ :)
https://docs.microsoft.com/pl-pl/dotnet/desktop/wpf/data/how-to-implement-property-change-notification?view=netframeworkdesktop-4.8

ew. SO
https://stackoverflow.com/questions/18835232/updating-ui-based-on-property-change-in-a-view-model

edytowany 1x, ostatnio: Kardash
obscurity
Wyżej wymienione przykłady są dla WPF, ale w formsach można zrobić podobnie - musisz tylko stworzyć model i zabindować z inspectora.
HI
"zabindować z inspectora" - możesz rozwinąć?
obscurity
mam na myśli "Properties". Klikasz na kontrolkę, w DataBindings klikasz na Text/Checked, wybierasz Add Project Data Source -> Object -> zaznaczasz klasę do której bindujesz -> Finish; wybierasz do którego propertiesa chcesz bindować. W kodzie przypisujesz twojBindingSource.DataSource = instancjaKlasy. W Advanced warto zmienić update mode na PropertyChanged żeby zmiana od razu była widoczna w innych kontrolach / kodzie. Jeśli chcesz zmieniać z kodu to musisz zawołać OnPropertyChanged
HI
  • Rejestracja:prawie 13 lat
  • Ostatnio:około 15 godzin
  • Postów:1857
0

@Kardasz dziękuję bardzo - dokładnie o to chodziło. Działa jak należy :).

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.