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?


  • Administrator

    Setz beide hin und schalte die Visibility um. Wenn du den Wert auf Collapsed setzt, dann ist das, als wäre das UIElement gar nicht dort.
    Noch interessant dürfte vielleicht BooleanToVisibilityConverter 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.


  • Administrator

    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 ein DataTemplate Mapping für das ViewModel hinzu. Wenn nun das ViewModel dargestellt werden soll, wird nach einem entsprechenden DataTemplate 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.


Anmelden zum Antworten