Ändern der Benutzer-Steuerung des Fensters dynamisch in WPF (MVVM)

Ich bin neu mit WPF und ich war gerade dabei ein einfaches Menü mithilfe von MVVM mit Bindungen und Befehle aber ich denke, ich mache etwas falsch. Ich will einfach nur, um das alles zu ändern der Fenster-Inhalt importieren eines neuen UserControl ich definiert, wenn ich drücken Sie die Menü-Taste. Das heißt, ich will verschwinden die Menü-und zeigt einen neuen Inhalt (der Benutzersteuerelemente, die ich oben erwähnt).

Naja ich hab das Hauptfenster (ControlPanel):

<Window x:Class="OfficeMenu.Views.Menu.ControlPanel"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Control Panel" Height="800" Width="800">
<Grid>

    <ContentControl Content="{Binding contentWindow}"/>

</Grid>
</Window>

Diese Benutzersteuerelemente , bietet ein Menü mit Schaltflächen für das Hauptfenster, wenn ich das Projekt ausführen:

<UserControl x:Class="OfficeMenu.Views.ButtonsMenu"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         mc:Ignorable="d" 
         d:DesignHeight="300" d:DesignWidth="300">
<UserControl.Resources>
    <!-- One style for each *type* of control on the window -->
    <Style TargetType="Button">
        <Setter Property="Margin" Value="5"/>
    </Style>

</UserControl.Resources>
 <Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="1*" />
        <ColumnDefinition Width="1*" />
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition Height="1*" />
        <RowDefinition Height="1*" />
    </Grid.RowDefinitions>
    <Button Command="{Binding OpenUsersCommand}">BUTTON 1</Button>
    <Button Grid.Column="1">BUTTON 2</Button>
    <Button Grid.Column="1" Grid.Row="2" >BUTTON 3</Button>
    <Button Grid.Row="1">BUTTON 4</Button>
</Grid>
</UserControl>

Dies ist das ViewModel Im mit für es:

class MenuViewModel : ViewModelBase
{
    RandomModel _model;  <!-- It does nothing important -->
    private UserControl _content;

    public ICommand OpenUsersCommand { get; private set; }

    public UserControl Content
    {
        get { return _content; }
        set {
            _content = value;
            NotifyPropertyChanged("contentWindow");
        }
    }

    public MenuViewModel(RandomModel model )
    {
        this._model= model;
        OpenUsersCommand = new RelayCommand(OpenUsers,null);
    }

    private void OpenUsers()
    {
        Content = new UsersPanel();  //This is the UserControl we need to load dinamically
    }
}

In Der App.xaml.cs laden wir das Hauptfenster:

public partial class App : Application
{

    private void OnStartup(object sender, StartupEventArgs e)
    {
        ControlPanel view = new ControlPanel();
        view.ShowDialog();
    }
}

Nun, das controlPanel.xaml.cs:

public ControlPanel()
    {
        InitializeComponent();

        ModelRandom model = new ModelRandom(); <!-- It does nothing yet -->
        MenuViewModel viewmodel = new MenuViewModel(model);
        Content = new BottonsMenu();  <!-- We load a default UserControl when we run the program -->
        this.DataContext = viewmodel;
    }
}

Danke Ihnen sehr.

Im view-Modell gibt es keine Eigenschaft "contentWindow", die Sie verwenden, in der Bindung und wie OpenUsers Funktion binden OpenUsersCommand
Sorry, ich tryied, zu übersetzen meinen code vor dem posten Sie es und vergessen zu ändern. Aber ich habe immer noch das gleiche problem.
Ich benutze Prism und (wenn ich verstehe, was Sie versuchen zu tun), die Sie möchten, dass Ihre Haupt-Fenster haben zwei Regions: ein-Tasten-region und ein 'main-content' - region. Sie wollen dann zum laden einer bestimmten VM in das 'main-content' - region, basierend auf dem Befehl wurde ausgelöst durch einen button in der button-region. Sehr einfach, und sehr schön verarbeitet in der PRISMA. Für weitere Informationen Suche nach MVVM-navigation Themen.

InformationsquelleAutor Ferran | 2014-09-08

Schreibe einen Kommentar