Eventy w modelu MVVM w WPF

Eventy w modelu MVVM w WPF
QA
  • Rejestracja:ponad 9 lat
  • Ostatnio:prawie 9 lat
  • Lokalizacja:Tychy
  • Postów:45
0

Witam,
ja mam pytanie odnośnie używania eventow w modelu MVVM, ponieważ potrzebowałbym np eventow typu "Mouse Down" "Mouse Up", no a z tego co wiem to w modelu MVVM jest możliwość bindowania tylko kliknięć. Także pytanie jak to rozwiązać?

grzesiek51114
grzesiek51114
  • Rejestracja:ponad 11 lat
  • Ostatnio:ponad 4 lata
  • Postów:2442
0

Możesz sobie do Viewmodelu przekazać kontrolkę przez konstruktor. W modelu możesz utworzyć do niej publiczną referencję. To co teraz musisz zrobić to utworzyć obiekt modelu wewnątrz Viewmodelu i przypisać do publicznej referencji kontrolkę z konstruktora Viewmodelu. Tym sposobem masz kontrolkę z eventami dostępną w całym Viewmodelu :)

Pseudokod:

Kopiuj
public class Model{
	public Textbox PoleTekstowe;
}

public class Viewmodel{
	private Model _model;
	public Viewmodel(Textbox tb){
		this._model = new Model();
		this._model.PoleTekstowe = tb;
		this.UstawZdarzenia();
	}

	private void UstawZdarzenia(){
		this._model.PoleTekstowe.TextChanged+=(sender,args)=>{
			// Obsługa zdarzenia.
		};
	}
}

// Natomiast w Code-behind robimy bindowanie datacontextu:
var vm = new Viewmodel(this.MojaKontrolka);
this.DataContext = vm;

// Wewnątrz XAML
<TextBox Name="MojaKontrolka"/>
edytowany 7x, ostatnio: grzesiek51114
QA
  • Rejestracja:ponad 9 lat
  • Ostatnio:prawie 9 lat
  • Lokalizacja:Tychy
  • Postów:45
0

Jeśli dobrze rozumiem to coś na zasadzie, która przedstawiono tutaj? :
http://www.codeproject.com/Tips/478643/Mouse-Event-Commands-for-MVVM

grzesiek51114
grzesiek51114
Nie, bo tam jest pokazane tworzenie w ogóle oddzielnego zachowania dla myszy (dependency property MouseUpCommand), a tutaj po prostu przekazujesz do viewmodelu referencje do obiektu.
QA
  • Rejestracja:ponad 9 lat
  • Ostatnio:prawie 9 lat
  • Lokalizacja:Tychy
  • Postów:45
0

Ale w twoim rozwiązaniu eventy które będę mieć będą mogły działać tylko n konkretnej kontrolce która wyśle, nie będa uniwersalne, jeśli dobrze rozumiem

grzesiek51114
grzesiek51114
  • Rejestracja:ponad 11 lat
  • Ostatnio:ponad 4 lata
  • Postów:2442
1

Pewnie. Zresztą to naturalne, ponieważ TextBox ma inne eventy niż np. ComboBox etc. To co możesz zrobić żeby uzyskać uniwersalność to przekazywać przez konstruktor Viewmodelu kontrolki jako liste albo tablice obiektów klasy object i przypisywać im zdarzenia rzutujac je później na obiekty konkretnych kontrolek. Sprawdzony sposób i działa.

Zresztą jak chcesz zrobić uniwersalny event np. MouseClicked to zamiast lambdy napisz funkcje i ja przypisz do eventa dla kontrolek, które MouseClicked obsługują. Wszystkie kontrolki masz wszak na liście z konstruktora.

edytowany 2x, ostatnio: grzesiek51114
QA
  • Rejestracja:ponad 9 lat
  • Ostatnio:prawie 9 lat
  • Lokalizacja:Tychy
  • Postów:45
0

W sumie, jak tak sie zastanowić to ta uniwersalność nie jest mi potrzebna tak jak mi się wydawało, więc wielkie dzięki za nakierowanie ;)

grzesiek51114
grzesiek51114
W sumie możesz przekazać do konstuktora liste obiektow klasy Control i przypisywać im eventy w pętli bez rzutowania, bo klasa Control już ma je zdefiniowane i są one dziedziczone przez kontrolki WPF. Taka dygresja... wyjść jest wiele.
QA
  • Rejestracja:ponad 9 lat
  • Ostatnio:prawie 9 lat
  • Lokalizacja:Tychy
  • Postów:45
0

A to jeszcze jedno pytanie przy okazji, co zrobić żeby po kliknięciu w jakimś miejscu w kontrolce dajmy na to Image dostać wsp miejsca w którym się kliknęło?

grzesiek51114
grzesiek51114
  • Rejestracja:ponad 11 lat
  • Ostatnio:ponad 4 lata
  • Postów:2442
0

Niestety nie mam tego teraz jak sprawdzić ale najpewniej będzie to obsługa zdarzenia MouseDown dla klasy Image. Może to też Ci jakoś pomoże http://stackoverflow.com/questions/3539144/wpf-check-mouse-movement-and-cursor-position-within-mouseleftbuttondown-handler

edytowany 1x, ostatnio: grzesiek51114

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.