Eventy w modelu MVVM w WPF

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ć?

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:

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"/>
0

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

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

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.

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

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?

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

1 użytkowników online, w tym zalogowanych: 0, gości: 1