Domanda

In breve la mia domanda è: come si preferisce esporre filtrati / ordinati ObservableCollections / raggruppati per Vista in WAF

ero abbastanza soddisfatto del mio primo tentativo che ha coinvolto il filtraggio sulla VM e di esporre un ICollectionView di oggetti del modello per la vista di legarsi a:

public StartDetailViewModel(IStartDetailView view, StartPoint start, Scenario scenario)
        : base(view)
    {
        this.scenario = scenario;
        this.start = start;

        this.startsViewSource = new CollectionViewSource();
        this.startsViewSource.Filter += new FilterEventHandler(Starts_Filter);
        this.startsViewSource.Source = scenario.Starts; 
    }
    public ICollectionView FilteredStarts
    {
        get
        {
            return startsViewSource.View;
        }
    }
    void Starts_Filter(object sender, FilterEventArgs e)
    {
        if (e.Item != null)
        {
            e.Accepted = (((StartPoint)e.Item).Date == this.start);
        }
    }
}

Tuttavia, esponendo il modello oggetti direttamente non è sufficiente in quanto ogni elemento ora bisogno di un proprio ViewModel.

Quindi, CollectionViewSource.Source è ora collegato a una raccolta di pareri. Il problema principale di questo è quando l'applicazione di filtri:

void Starts_Filter(object sender, FilterEventArgs e)
{
    //Since e.Item is now a view we are forced to ask the View for the ViewModel:
    StartItemViewModel vm = ((IStartItemView)e.Item).GetViewModel<StartItemViewModel>();
    [...]
}

Questo si sente male a me. Ci sono metodi migliori?

Aggiorna

Così sono ritornato ad un CollectionViewSource.Source di oggetti del modello e mantenuto una raccolta separata di bambino Visualizza oggetti a cui la vista era vincolato.

La domanda allora, naturalmente, è il motivo per cui sto utilizzando CollectionViewSource in un ViewModel a tutti?

Credo applica la seguente prinicple: Se il filtraggio / funzionalità di ordinamento è una proprietà del Solo visualizzazione (ossia una vista alternativa potrebbe legittimamente non fornire tali funzionalità) quindi CollectionViews deve essere utilizzato nella vista (con codice sottostante come necessario ). Se il filtraggio / ordinamento funzionalità è una dimensione allora questo può essere trattato nel ViewModel o modello con altri mezzi Modello.

Questo ha un senso una volta che ti rendi conto che code-behind in vista MVVM è perfettamente accettabile.

Qualche commento?

È stato utile?

Soluzione

Credo che il vero vantaggio di CollectionView sta nel quando si è nel bisogno di riportare informazioni come passo attraverso le voci CollectionView uno per uno. In questo modo si è in grado di utilizzare la proprietà CurrentPosition e MoveCurrentToNext (/ etc.) Metodi che possono essere desiderabile. In particolare mi piace l'idea di essere in grado di riferire le notifiche PropertyChanged in MVVM quando proprietà degli elementi della collezione cambiati / elementi vengono aggiunti / rimossi / modificati.

Credo che rende solo un po 'più senso utilizzare nei controlli che richiedono notifiche più complesse (come ad esempio DataGrid, in cui si consiglia di generare eventi PropertyChanged e salvare sul datastore ogni volta che selectionchanges o un nuovo elemento è addd a il controllo).

Mi auguro che abbia un senso. Questo è proprio quello che sto mettendo insieme come un principiante.

Inoltre, io davvero non credo che qualcosa dovesse andare in code-behind di una vista ad eccezione di un DataContext e dati condivisi potrebbe essere l'alimentazione da un ViewModel.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top