Ä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.
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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich denke, das problem ist, dass Sie versuchen, ändern Sie die Content-Eigenschaft von ContentControl, die nicht die Eigenschaft von der ViewModel. Sie haben angeschlossen Ihr ViewModel an die host-ControlPanel, aber auch Sie müssen die separaten anzeigen von Modellen für die Benutzer-Steuerelementen, die gehostet werden, gibt es. Ich habe Hinzugefügt-Klasse für Benutzer-Steuerelement-view-Modell und geänderte host-view-model-Eigenschaft, name für die übersichtlichkeit Willen. Korrigieren Sie den code wie folgt.
Hauptfenster XAML
Hoffe, es ist durchaus verständlich.
UserControl
imViewModel
ist nicht erlaubt in MVVMNie glauben, auf diese Weise. Sie sagen, dass nur weil jemand hat es dir gesagt. Jedes mal denken Sie kritisch und überlegen Sie, was für Sie am besten ist trotz dieser "Regeln". Nehmen Sie nicht andere Meinungen als deine. Das bringt meiner Meinung - jemand kann Ihnen sogar sagen, dass in der code-behind-sollte nicht eine einzige Zeile code. Das ist bullshit. Im code hinter Sie code schreiben, ist im Zusammenhang zu sehen.
Gibt es Gründe für die Existenz von
MVVM
Wort. Allerdings bin ich nicht die Verlängerung der Konversation hier. DankInformationsquelleAutor Michael Ro