2017-11-02 4 views
0

Ich bin neu im MVVM-Muster, aber ich verstehe einiges davon. Das Problem, das ich momentan habe, ist, dass ich eine Seite öffnen möchte, wenn eine Taste gedrückt wird, die das MVVM-Muster verwendet. Wenn eine der sechs Tasten gedrückt wird, kann mir ein Befehl den Namen der gedrückten Taste geben. Mein Problem ist, dass ich nicht weiß, wie man den Inhalt des Frames einstellt, wenn die Taste gedrückt wird.Frame-Inhalt festlegen, wenn eine Schaltfläche mit MVVM geklickt wird

<StackPanel> 
     <Button Content="Page 1" x:Name="Page1" 
       Command="{Binding SimpleCommand, Source={StaticResource ViewModelBase}}" 
       CommandParameter="{Binding Name, ElementName=Page1}"/> 
     <Button Content="Page 2" x:Name="Page2" 
       Command="{Binding SimpleCommand, Source={StaticResource ViewModelBase}}" 
       CommandParameter="{Binding Name, ElementName=Page2}"/> 
    </StackPanel> 

Oben ist der XAML-Code jetzt. Die simplecommand wird nur auf den Namen auf den Button schreiben

<Frame x:Name="MainFrame" Grid.Column="1" Grid.Row="1" 
      Content="{Binding Name, Converter={StaticResource Converter}, ElementName=Page1}" 
      NavigationUIVisibility="Hidden"/> 

Obige ist der Rahmen, die ich den Inhalt ändern möchten. Zur Kompilierzeit kann ich die Seite einstellen, die es öffnen soll. Ich möchte den Inhalt auf Laufzeit einstellen, wo ich den Knopfnamen verwende. Der Konverter ist nur der IValueConverter, wo ich eingestellt habe, welche Seite er anzeigen soll.

+0

Hallo, willkommen in SO. Bitte fügen Sie Ihren Code hinzu. –

+0

Hey. Jetzt den Code hinzugefügt. Ich hoffe, es wird helfen. – ACmiester

Antwort

1

Die Art, wie ich das angegangen bin, war nicht mit einem Rahmen, sondern mit einem ContentPresenter. Sie können immer die ContentPresenter innerhalb Ihrer Frame einfügen. Bedenken Sie, dass FrameDataContext nicht erbt, also würde ich es vermeiden.
Um zu beginnen, erstellen wir eine BaseViewModel unseren Ausgangspunkt für Ansichten.

public class BaseViewModel : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    protected virtual void OnPropertyChanged(string propertyName = null) 
    { 
     PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

Jetzt, wo wir die Basis haben wir erstellen MainViewModel:

public class MainViewModel : BaseViewModel 
{ 
    private BaseViewModel selectedViewModle; 

    public BaseViewModel SelectedViewModel 
    { 
     get { return selectedViewModle; } 
     set { selectedViewModle = value; OnPropertyChanged(nameof(SelectedViewModel)); } 
    } 
} 

An dieser Stelle unsere MainViewModel hat eine Eigenschaft mit SelectedViewModel das ist, was wir für unsere Navigation verwenden werden.
Annahme
Ich gehe davon aus, dass Sie ein funktionierendes Wissen über Befehle und deren Verwendung haben.
Hier ist ein Codebeispiel für ein Verfahren für die Navigation command:

void navigate(object parameter) 
{ 
    SelectedViewModel = new DetailsViewModel(); 
} 

Und hier ist der Code für DetailsViewModel:

public class DetailsViewModel : BaseViewModel 
{ 
    //your code with properties and methods here 
} 


ist jetzt der Ansicht einrichten lassen:

<UserControl ...> 
    <Grid> 
     <ContentPresenter Content="{Binding .}"/> 
    </Grid> 
</UserControl> 

Jetzt im Ressourcen-Tag für Ihre UserControl umfassen eine DataTemplate:

<DataTemplate DataType="{x:Type vm:DetailsViewModel}"> 
    <Grid .../> 
</DataTemplate> 

An dieser Stelle haben Sie den Inhalt der Datenvorlage für Sie auf dem Bildschirm dargestellt.

+1

Hey. Ich werde versuchen, es zur Arbeit zu bringen. Aber danke :). Froh, dass jemand eine Lösung dafür hat, damit ich weiter komme :). Aber danke, Mann. Einen schönen Tag noch :). – ACmiester

Verwandte Themen