Contesto:
Sto creando un'applicazione WPF usando MVVM. Ho un Page
che visualizza uno stato che informa su quale attività l'applicazione sta eseguendo su Sfondo.
Ho un contenitore e associo il suo Content
a una proprietà su ViewModel
.
Per un'illustrazione, dai un'occhiata al seguente codice:
<StackPanel x:Key="Status_Success" Orientation="Horizontal">
<iconPacks:PackIconMaterial Kind="Check" />
<TextBlock>Success!</TextBlock>
</StackPanel>
<StackPanel x:Key="Status_Error" Orientation="Horizontal">
<iconPacks:PackIconMaterial Kind="Exclamation" />
<TextBlock>Error!</TextBlock>
</StackPanel>
Se l'attività in background ha esito positivo, impostare la proprietà content su Status_Success
StackPanel
. Altrimenti, avrei impostato il contenuto su Status_Error
.
Ecco il binding:
<Controls:TransitioningContentControl [...] Content="{Binding CurrentStatusElement}">
Problema:
Bene, in primo luogo ho creato tutto StackPanels
come Resources
nel mio Page
. Ma come ho detto, sto utilizzando MVVM, quindi non ho accesso diretto alle risorse della pagina da ViewModel
.
approcci:
Ecco alcuni possibili approcci (queste non sono le uniche possibilità, sto prendendo in considerazione):
1. Creare gli StackPanel sul ViewModel:
StackPanel _StatusSuccessElement = new StackPanel();
_StatusSuccessElement.Children.Add([...];
[...]
2. Crea un nuovo Resource Dictionary
e importalo in ViewModel
:
var resourceDictionary = new ResourceDictionary()
{
Source = new Uri("SymbolTemplates.xaml", UriKind.Relative)
};
StackPanel _StatusSuccessElement = resourceDictionary["Status_Success"] as StackPanel;
3. Crea un elemento (Pagina / UserControl / qualunque) e crea una nuova istanza di esso su View Model
var _StatusSuccessElement = new StatusSuccessElement();
Domanda:
-
Quali di questi approcci si adattano meglio a MVVM e perché?
-
Se nessuno, qual è l'approccio migliore per prevenire le violazioni del pattern?