CheckBox - wiązanie dwukierunkowe.

CheckBox - wiązanie dwukierunkowe.
HI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1863
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...

Tobiasz Stamborski
  • Rejestracja: dni
  • Ostatnio: dni
  • 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: dni
  • Ostatnio: dni
  • 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ę.

AdamWox
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Jastrzębie-Zdrój
  • Postów: 2180
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ążę ;-)

KA
  • Rejestracja: dni
  • Ostatnio: dni
  • 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

HI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1863
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.