Austausch eines UserControls WPF
-
Hallo zusammen.
Mein WPF Projekt beinhaltet eine MainView. In dieser Mainview würde ich gerne 2 unterschiedliche Usercontrols anzeigen. Also nicht gleichzeitig. Sondern ich würde gerne auf einen Button klicken und so von einem UserControl zum anderen navigieren.
Wie realiseiert man so was?
Was ich schon gefunden habe sind sogenannte "Masterpages". Hier werden allerdings statt UserControls Pages verwendet. Geht so was auch mit Usercontrols?
-
Setz beide hin und schalte die
Visibility
um. Wenn du den Wert aufCollapsed
setzt, dann ist das, als wäre dasUIElement
gar nicht dort.
Noch interessant dürfte vielleichtBooleanToVisibilityConverter
sein. Oder falls die Dinger anders binden willst, kannst natürlich deinen eigenen Konverter schreiben.Grüssli
-
Ok. Gut danke.
-
Noch was dazu.
Mit dem Visibility klappt das ja nun ganz gut. Wenn man 2 Controls hat"
Wenn man aber mehrere Controls hat die man austauschen will und dies auch erweitern will ist das keine so gute Idee mehr. Sollte man dann zu Pages wechseln. Oder gibt es noch eine andere Möglichkeit.
-
Parker schrieb:
Noch was dazu.
Mit dem Visibility klappt das ja nun ganz gut. Wenn man 2 Controls hat"
Wenn man aber mehrere Controls hat die man austauschen will und dies auch erweitern will ist das keine so gute Idee mehr. Sollte man dann zu Pages wechseln. Oder gibt es noch eine andere Möglichkeit.Naja, du kannst das auch für 3 oder mehr machen. Aber ja, aber eine gewissen Anzahl wird es langsam unübersichtlich
Was du aber auch machen könntest ist ein
DataTemplate
Mapping. Binde einfach an den Content, wo du etwas darstellen willst, das zu verwendende ViewModel. In den Ressourcen fügst du dann einDataTemplate
Mapping für das ViewModel hinzu. Wenn nun das ViewModel dargestellt werden soll, wird nach einem entsprechendenDataTemplate
gesucht und gefunden.Beispiel:
<Window x:Class="WpfTest.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:WpfTest="clr-namespace:WpfTest" Title="MainWindow" SizeToContent="WidthAndHeight"> <DockPanel> <DockPanel.Resources> <DataTemplate DataType="{x:Type WpfTest:RedClass}"> <Rectangle Fill="Red" /> </DataTemplate> <DataTemplate DataType="{x:Type WpfTest:GreenClass}"> <Rectangle Fill="Green" /> </DataTemplate> </DockPanel.Resources> <Button DockPanel.Dock="Top" Click="OnSwitchClick">Switch</Button> <ContentControl Content="{Binding Data}" MinWidth="200" MinHeight="200" /> </DockPanel> </Window>
using System.Windows; using System.ComponentModel; namespace WpfTest { public class RedClass { } public class GreenClass { } public partial class MainWindow : Window, INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; public object Data { get; set; } public MainWindow() { InitializeComponent(); this.Data = new RedClass(); this.DataContext = this; } private void OnSwitchClick(object sender, RoutedEventArgs e) { if(this.Data is RedClass) { this.Data = new GreenClass(); } else { this.Data = new RedClass(); } RaiseDataChanged(); } private void RaiseDataChanged() { var handler = this.PropertyChanged; if(handler != null) { handler(this, new PropertyChangedEventArgs("Data")); } } } }
Gibt sicher noch mehr Lösungsansätze
Grüssli
-
Hallo
Ich habe aber nur ein ViewModel. Weil die Daten die selben sind. Sie werden nur unterschiedlich dargestellt.