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?