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:
- Tworzysz klasę implementującą INotifyPropertyChanged;
class ViewModelBase : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged(string property)
{
this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(property));
}
}
- 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));
}
}
}
- 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>();
}
}
- 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.