WPF Zmiany na datagridzie w view modelu.

0

Witam, czy dopuszczalne jest taki zapis w WPF MVVM:

Konstruktor w view w code behind:

var viewModel = new ViewModel();
viewModel.MainGrid = MainGrid2; // MainGrid property z viewmodelu, a MainGrid2 to nazwa DataGrid w view
DataContext = viewModel;

nastepnie w viewmodel np.:

MainGrid.BeginEdit();

Czy dopuszczalny jest taki zapis? Czy powinno sie to zrobic w inny sposob?

0

Nie. Viewmodel nie powinien mieć żadnych informacji na temat widoku więc powiązanie grida do innego grida w viewmodelu jest nieprawidłowym podejściem. Viewmodel powinien przechowywać kolekcję rekordów dla DataGrid'a, a nie referencję do samej kontrolki.

Zapomnij w ogóle o korzystaniu w VM z przestrzeni nazw System.Windows.Controls, może poza jednym wyjątkiem.

0

Miales moze kiedys taki problem jak rozpoczac edycje komorki z kodu w viewmodelu? Siedzialem dzisiaj dosc dlugo nad tym o dopiero tak mi sie udalo to zrobic (chociaz wlasnie nie podoba mi sie ten sposob ;/).

1

Viewmodel nie rozpoczyna edycji komórki. Edycję komórki rozpoczyna widok i przekazuje dane, które wpisałeś do viewmodelu.
Nie obsługujesz kontrolki jako takiej wewnątrz viewmodelu, zresztą nie musisz, bo po zbindowaniu danych wszystko dzieje się automagicznie samo.

"Pacz":

W skrócie:

  1. Tworzysz klasę implementującą INotifyPropertyChanged;
class ViewModelBase : INotifyPropertyChanged
{	
	public event PropertyChangedEventHandler PropertyChanged;
	public void OnPropertyChanged(string property)
	{
		this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(property));
	}
}
  1. Tworzysz viewmodel dla rekordu datagrida dziedziczący po tej klasie:
// Tak, Person jest modelem widoku dla rekordu DataGrida.
class Person : ViewModelBase
{
	private string name;
	public string Name
	{
		get => name;
		set 
		{
			name = value;
			OnPropertyChanged(nameof(Name));
		}
	}
}
  1. Tworzysz viewmodel dla "ogólnego" widoku i wsadzasz do środka kolekcję obiektów klasy Person:
class MainViewModel : ViewModelBase
{
	private IList<Person> persons;
	public IList<Person> Persons
	{
		get => persons;
		set
		{
			persons = value;
			OnPropertyChanged(nameof(Persons));
		}
	}
	
	private Person selectedPerson;
	public Person SelectedPerson
	{
		get => selectedPerson;
		set 
		{
			selectedPerson = value;
			OnPropertyChanged(nameof(SelectedPerson));
		}
	}
	
	public MainViewModel()
	{
		//	Tak, musi to być kolekcja typu ObservableCollection, żeby widok mógł detektować zmiany w kolekcji.
		Persons = new ObservableCollection<Person>();
	}
}
  1. Bindujesz Persons oraz SelectedPerson do odpowiednich własności w XAML
<DataGrid ItemsSource="{Binding Persons, UpdateSourceTrigger=PropertyChanged}"
		  SelectedItem="{Binding SelectedPerson, UpdateSourceTrigger=PropertyChanged}" />

I wszystko leci z automatu w obie strony:

  • VM => Widok;
  • Widok => VM.

PS: mogą być błędy, bo piszę z pamięci, a WPF już ze dwa miechy nie ruszałem.

0

Dzięki za chęć pomocy, ale to nie rozwiązuje mojego problemu :/

Zadanie jest takie:
Mam datagrida, uzytkownik kliknal w jakis przycisk typu "dodaj rekord", w tym momencie dodaje w viewmodelu do listy (zbindowany itemsource do datagrida) np new Person - tutaj wszystko jest ok. Ustawiam dodany rekord czyli new Person jako zaznaczony (binduje SelectedItem) - tutaj jest ok, ale problem pojawia się w momencie gdy próbuje zrobić aby ten nowy dodany rekord był od razu w trybie edycji - czyli np. rekord jest caly zaznaczony a pierwsza kolumna np. jakiś textbox jest w trybie edycji (nie mylic z focus).

0

PS znasz moze jakas godna polecenia ksiazke z zaawansowanych technik wpf/mvvm (nie liczac ksiazki Nathana i Matulewskiego), ewentualnie jakis kurs?

0

Zaczynałem z MVVM jakieś 5 lat temu i nawet nie wiem jakie kursy to były. Zresztą pewnie i tak byłoby to nieaktualne. Książki też nie polecę, bo nie wiem, którą miałbym polecić. Wszystkiego uczyłem się na podstawie dokumentacji MSDN, kursów z netu i... porad z tego forum, bo wbrew pozorom wiele rzeczy dotyczących np. MVC sprawdza się świetnie przy MVVM :)

0

Ok, a jakis pomysl masz jak sobie poradzic z tym zadaniem 2 posty wyzej zgodnie z zasadami mvvm?

0

Teraz to trochę nie bardzo mam jak ale moze @Ktos pomoże, bo ja przez kom. nadaję :)

0
grzesiek51114 napisał(a):

@Mały Orzeł Rozwiązanie Twojego problemu: https://stackoverflow.com/questions/3426765/single-click-edit-in-wpf-datagrid

W sumie jest szansa, że to zadziała. Bede tylko musiał podpiac wlasne zdarzenie zamiast "DataGridCell.Selected" (w moim przypadku bedzie to dodanie nowego rekordu), potestuje :)
Dzięki.

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