Wzorzec MVVM [ WPF ] i dodanie rekordu do tabelki

0

Witam

Czytam ten tutorial:

http://www.codeproject.com/Articles/126249/MVVM-Pattern-in-WPF-A-Simple-Tutorial-for-Absolute?msg=4140048#xx4140048xx

i w tym kodzie w ViewModel

 
private ICommand mUpdater;
private ICommand mAdder;
    public ICommand UpdateCommand
    {
        get
        {
            if (mUpdater == null)
                mUpdater = new Updater();
            return mUpdater;
        }
        set
        {
            mUpdater = value;
        }
    }

Autor aktualizuje rekordy, za chiny ludowe nie mogę zaimplementować swojego interfejsu, który doda rekord do tabelki po naciśnięciu buttona, to moje wypociny:

 
        public ICommand AdderCommand
        {
            get
            {
                if (mAdder == null)
                    mAdder = new Adder();
                save();
                return mAdder;
            }
            set
            {
                mAdder = value;
            }
        }

metoda:

public void save()
        {
            m_Products.Add(new Product { ID = 40, Name = "Procek", Price = 30 });
        } 

Pozdrawiam

0

Źle rozumiesz wzorzec komendy w MVVM. Tutaj 'get' wywołuje się tylko raz, natomiast przy kliknięciu uruchamiana jest metoda 'Execute' z interfejsu 'ICommand'. Popatrz jak w tym tutorialu napisano klasę RelayCommand i to jej używaj jej przy ICommand.

0

Dziękuję za odpowiedź. Napisałem ( próbuję ) napisać klasę, która implementuje ICOmmand:

 
class MyCommand:ICommand
    {
        public bool CanExecute(object parameter)
        {
            return true;
        }

        public event EventHandler CanExecuteChanged;

        public void Execute(object parameter)
        {
            Model model = new Model();
            model.Surname = "coś";
            model.Name = "coś";

//Tutaj źle 
        }
    }

w metodzie Execute ma mi się do listy dodać nowy obiekt, ale za cholerę nie mogę tego wyabstrahować...........

0

Użyj gotowych bibliotek, np. MVVM Light. Będziesz tam miał masę przydatnych narzędzi, takich jak ViewModelLocator, Messages, czy też RelayCommand które starasz się utworzyć. Oczywiście warto zajrzeć w kod, który masz w tym tutorialu.

doda rekord do tabelki po naciśnięciu buttona

Chyba niezbyt rozumiesz te command, więc całość W WIELKIM skrócie:
View:
Wciśnięcie buttona ma spowodować wywołanie komendy. Przypisujesz myButton.Command = AdderCmd; Oczywiście, lepiej jak robisz to w pliku *.xaml.
Skąd w pliku xaml masz dostęp do AdderCmd? Dzięki temu:

<Window.DataContext>
        <local:MainWindowViewModel/>
    </Window.DataContext>

Powyższy kod 'łączy' View z ViewModel.

Teraz ViewModel:
Aby używać AdderCmd w View, musimy ją utworzyć w ViewModel:

RelayCommand AdderCmd { get; set; }

Oczywiście przydało by się jej też nadać wartość początkową, np w konstruktorze:

AdderCmd = new RaleyCommand(Save);

Tak stworzony AdderCmd w momencie wywołanie tej właśnie komendy, wywoła Twoją metodę Save.

Model:
Jak będziesz pisał coś większego (ja polecam i tak w każdym projekcie), to zarządzanie danymi wykonuj nie w ViewModel, a w Model. W MVVM Light

Edit:
Jeszcze patrząc na Twoje starania utworzenia komendy: Klasa command powinna być ogólna. jej obiekt tylko zawiera wskaźnik do metody która ma być wywoływana gdy wywołamy komendę. Musiał byś tam dodać jakiś konstruktor i w nim przypisać argument - delegata do jakiejś zmiennej. W Execute zaś wywołać funkcję 'ukrytą' w tym delegacie.

0

Świetnie udało się. Dodałem rekord i nawet go zaktualizowałem. Dodanie wygląda tak:

 

private void Add()
        {
            _person.Add(Person);
            Person = new Person();
        }

public ICommand Adder
        {
            get
            {
                if (add == null)
                {
                    add = new RelayCommand(param => this.Add(), null);
                }
                return add;
            }
        }

Moje pytanie brzmi jak usunąć teraz dany rekord z tabelki...

 
private void Delete()
        {
            _Person.Remove(Person);
        }

Ale na chłopski rozum to nie wiem jak to wykonać :-)

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