L'approccio Best in MVVM non significa necessariamente facile. Mi piacciono i seguenti approcci:
a) Creare un valore booleano per la visibilità di ciascun oggetto e associare ogni oggetto a questo (con un convertitore bool-> visibilità).
Questo metodo è il più intuitivo e classico per impostare Visibilità per Control
.
b) Legarsi all'enum, con un convertitore univoco per ciascun oggetto.
c) Legarsi all'enumerazione, con un singolo convertitore che accetta un parametro.
Nel caso del convertitore, Enum
è il meglio non tenere in Model
e nel lato di View
. Perché il problema si risolve sul lato di View, che è abbastanza logico e qui per memorizzare la struttura dei dati. In linea di principio, non è critico.
Esempio:
public sealed class InvertableBooleanToVisibilityConverter : IValueConverter
{
enum Parameters
{
Normal,
Inverted
}
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
var boolValue = (bool)value;
var direction = (Parameters)Enum.Parse(typeof(Parameters), (string)parameter);
if (direction == Parameters.Inverted)
return !boolValue ? Visibility.Visible : Visibility.Collapsed;
return boolValue ? Visibility.Visible : Visibility.Collapsed;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return DependencyProperty.UnsetValue;
}
}
Un paio di commenti su altri approcci:
d) utilizzare un gestore di stato visivo con fotogrammi chiave booleane, e guidare lo Stato da VM con una proprietà associata.
Per queste situazioni, sembra complicato, quindi non vedere il punto in esso. Tuttavia, se le condizioni di impostazione della visibilità non sono difficili, è possibile utilizzare VisualStateManager
.
e) Associare il codice VM al codice sottostante e impostare la visibilità attraverso il codice.
Code-behind in questo caso non è giustificato quando è possibile risolvere il problema utilizzando gli strumenti tipici di MVVM (rilegatura, convertitori, ecc.). Credo che, in questo caso non sarebbe una violazione del principio di MVVM, se si sceglie l'elemento al Visibility
non è la logica di business coinvolti, come ad esempio può venire impostazione di visibilità per pressione dei CheckBox
, ToggleButton
, ecc
puoi mostrare qualche codice dal tuo modello e viewmodel per vedere il tuo enum e l'uso nel tuo vm – blindmeis
btw se la tua vista vuole solo un oggetto alla volta perché il tuo viewmodel non ha esporre un oggetto alla volta? – blindmeis