MVVM Light tworzenie RelayComand

Odpowiedz Nowy wątek
2013-07-05 02:36

Rejestracja: 7 lat temu

Ostatnio: 1 miesiąc temu

Lokalizacja: Bartoszyce

0

Zastanawiam się czy dobrze robię dodając Commands do mojego widoku. Komendy dodaję w klasie ViewModelu o tak :

 public RelayCommand LoadCommand
        {
            get
            {
                return new RelayCommand(new Action(() =>
                {
                    var dlg = new OpenFileDialog();
                    bool? result = dlg.ShowDialog();
                    if (result == true)
                    {
                        FileIO.LoadZip(new Uri(dlg.FileName, UriKind.RelativeOrAbsolute), MyEnums.DirsKeyWords.Source);
                    }
                }));
            }
        }

a za pomocą Lokatora z MVVM Light binduję komendę w Widoku


DataContext="{Binding Main, Mode=OneWay, Source={StaticResource Locator}}"

<MenuItem Header="Load" Command="{Binding LoadCommand}" />

Czy to tak się robi czy tworzycie nowe klasy dla komend i nie trzymacie ich w ViewModelu ?

edytowany 1x, ostatnio: wedlock, 2013-07-05 02:38

Pozostało 580 znaków

2013-07-05 14:14

Rejestracja: 10 lat temu

Ostatnio: 5 lat temu

1

U mnie jest tak:

View


<Button Name="rap5_Button" Style="{StaticResource ResourceKey=PodstawowyFioletowyButton}" Command="{Binding Path=rap5_Command}">Różnica</Button>

ViewModel


 private RelayCommand<object> _rap5_Command; //Różnica
        public ICommand rap5_Command
        {
            get
            {
                if (_rap5_Command == null)
                {
                    _rap5_Command = new RelayCommand<object>((param) => rap5());
                }

                return _rap5_Command;
            }
        }

Wszystko mam w ViewModel

edytowany 1x, ostatnio: Zoritt, 2013-07-05 14:17

Pozostało 580 znaków

dasdsasdasdsa
2013-07-05 19:03
dasdsasdasdsa
2

 private RelayCommand<object> _rap5_Command; //Różnica
        public ICommand rap5_Command
        {
            get
            {
                return _rap5_Command ?? (  _rap5_Command = new RelayCommand<object>((param) => rap5()));
            }
        }
Racja. Dzięki :-) - Zoritt 2013-07-05 19:53
Nie licząc klamr , 2 linijki mniej.... ale jak dla mnie, czytelniejsze jest na if-e :) - wedlock 2013-07-07 23:21

Pozostało 580 znaków

ikolpo
2013-07-05 20:06
ikolpo
1

Czy to tak się robi czy tworzycie nowe klasy dla komend i nie trzymacie ich w ViewModelu

Robi się to tak jak przestawiłeś. Nie ma sensu tworzyć nowej klasy jeśli używasz MVVM Light - ma to sens, gdy samemu implementujesz ICommand. Tutaj mamy już gotową, uniwersalną klasę i możesz jej używać w ViewModelach.
Jeszcze taka uwaga - to co masz w Action od RelayCommand mimo wszystko powinieneś starać się wyrzucać poza ViewModel, do jakiś serwisów ogólnie mówiąc. ViewModel powinien się ograniczać do pobrania danych i przygotowania do ich wyświetlenia, przetwarzanie i operacje na danych to nie jego działka.

Pozostało 580 znaków

2013-07-05 22:28

Rejestracja: 7 lat temu

Ostatnio: 1 miesiąc temu

Lokalizacja: Bartoszyce

0

Dzięki.

A w jaki sposób Wasze ViewModele komunikują się z Modelem? Jak macie to zaimpletowane ?

Pozostało 580 znaków

ikolpo
2013-07-06 01:20
ikolpo
1

Zależy czym dokładnie jest model.
Ogólnie jak pisałem, głównie przez serwisy, np:

var price = itemService.GetPriceWithDiscount(ItemId, Discount);  //ItemId, Discount - TwoWayBinding z formularza
Price = [konwersja price];
...
string Price { get { return price.ToString("C"); } set { price = value; RaisePropertyChanged("Price"); } }
...
decimal GetPriceWithDiscount(decimal Discount) { return DbContext.Items.FirstOrDefault(item => item.Id = ItemId).Price - Discount; }

Oczywiście to tylko głupi, przykład ale sama idea jest mniej więcej taka.

Pozostało 580 znaków

2013-07-06 02:40

Rejestracja: 10 lat temu

Ostatnio: 5 lat temu

1

Pomiędzy EF a ViewModel stosuję jeszcze klasę pośredniczącą Model.


 private void wplywy_list_Button_Click(object sender, RoutedEventArgs e)
        {
            new View.WplywyList(new ViewModel.WplywyList_VM(new Model.WplywyList_M())).Show();
        }

Wtedy w ViewModel:


private Model.WplywyList_M model;

public WplywyList_VM(Model.WplywyList_M model)
{
    this.model=model
}

W model np.


public List<MyData.Waluty_ComboBox_p_Result> GetWaluty_CB()
        {
            return waluty_EF.Waluty_ComboBox_p().ToList();
        }

Klasę model stosuję z przyzwyczajenia na zasadzie "bo zawsze była" ale chyba można się spokojnie jej pozbyć.

Pozostało 580 znaków

2013-07-07 23:26

Rejestracja: 7 lat temu

Ostatnio: 1 miesiąc temu

Lokalizacja: Bartoszyce

0

Pogubiłem się nieco , za dużo nowej wiedzy na raz :)

Statyczny model wczytuje zipa, depakuje go i układa dane w List<mojeentity>. Nie wiem jak przekazać tą listę do ViewModelu nie łamiąc konwencji MVVM ( dokładniej korzystam z MVVM Light ). Natomiast w ViewModelu dałem property <mojeentity> do którego zbindowałem się w View. Zależy mi na tym, żeby korzystając z dobrodziejstw databindingu i INotifyPropertyChanged z modelu wstrzyknąć dane do property ViewModelu.

edytowany 1x, ostatnio: wedlock, 2013-07-07 23:31

Pozostało 580 znaków

2013-07-08 00:03

Rejestracja: 10 lat temu

Ostatnio: 5 lat temu

Mam klasę bazową:


public class ViewModel_Base : Info_base, INotifyPropertyChanged

Z której dziedziczą mi wszystkie VM. Dodatkowo klasa ta implementuje mi interface IDataErrorInfo. W tym momencie IDataErrorInfo podłączam do tych VM gdzie go wykorzystuje.

I teraz to już prosto. Danę ciągnę z modelu. Podstawiam pod właściwości MV i na View binduje. Każdą zmianę odświeżam poprzez OnPropertyChanged.
Dodatkowo pod Entity tworzę partial classes i podłączam interface IDataErrorInfo, dzięki temu mogę kontrować poprawność wprowadzonych danych bezpośrednio do tabeli jak i zmiany we właściwościach VM.


partial class Wplywy : IDataErrorInfo

Przed każdym zatwierdzeniem (zamknięciem okienka z zapisem) sprawdzam czy Error bezpośrednio z MV lub z obsługiwanej tabeli nie zawiera błędów.


 if (this.Error != null || mainEdit.Error != null)
Przetrawiłem, pogooglalem i na koniec posiłkowałem się podpowiedziami z MVVM Light ... działa jako serwis. Dzięki za nakierowanie - wedlock 2013-07-09 23:22

Pozostało 580 znaków

Odpowiedz

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