Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Usercontrols dynamisch hinzufügen / entfernen
Mallett
myCSharp.de - Member



Dabei seit:
Beiträge: 176

Themenstarter:

Usercontrols dynamisch hinzufügen / entfernen

beantworten | zitieren | melden

Hallo zusammen,

ich habe ewig kein WPF mehr benutzt und muss jetzt eine Visualisierung basteln, allerdings bin ich ziemlich eingerostet, was WPF angeht.

Ich habe folgendes Problem:

Der Bediener kann zur Laufzeit über ein Hauptmenü (verknüpft im ViewModel über Commands) GruppenControls hinzufügen und entfernen. So weit so gut:


public class MainViewModel
{
   //...
   private async Task AddNewGroupCommandAction()
   {
       // Vorab wird über Netzwerk an eine Gegenstelle await ... gemacht
       
       // Dann lege ich mein neuen Gruppen-Usercontrol an und speichere es in einer List
       GroupViewModel vm = new GroupViewModel();
       GroupUserControl ctrl = new GroupUserControl(vm);
       
       // intern wird NotifyPropertyChanged etc. ausgeführt
       AddGroupControlToListProperty(ctrl);
   }

   //...
}

Da es maximal 8 Gruppen sein können, habe ich im MainView ein 4x2 Grid als Hauptelement. Ich würde jetzt gerne die GroupUserControls per Binding and meine GroupControlList binden, so dass die einzelnen UserControls in jeweils einer Zelle im Grid angezeigt werden, falls vorhanden. Also Element 0 der List in Zelle 1,1 usw.

<Page x:Class="Vendor.Pages.GroupView"
      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" 
      xmlns:local="clr-namespace:Vendor.Pages"
      mc:Ignorable="d" 
      d:DesignHeight="450" d:DesignWidth="800"
      d:DataContext="{d:DesignInstance Type=local:MainViewModel, IsDesignTimeCreatable=True}"
      Title="GroupView">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="1*" />
            <ColumnDefinition Width="1*" />
            <ColumnDefinition Width="1*" />
            <ColumnDefinition Width="1*" />
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="1*" />
            <RowDefinition Height="1*" />
        </Grid.RowDefinitions>
    </Grid>
</Page>

Erste Idee wäre jetzt, jeweils ein ContentControl für jede Zelle einzufügen und dann dessen Content an jeweils einen Eintrag in der List zu binden, aber genau da weiß ich nicht, wie ich an ein bestimmtes Element der Liste binden könnte.

Ist der Ansatz an sich falsch, gibt es einen besseren Weg?

Über einen Schubser in die richtige Richtung würde ich mich freuen.
Danke schonmal.
private Nachricht | Beiträge des Benutzers
MrSparkle
myCSharp.de - Team

Avatar #avatar-2159.gif


Dabei seit:
Beiträge: 5992
Herkunft: Leipzig

beantworten | zitieren | melden

Im MainViewModel solltest du keine Controls erstellen, sondern eigene ViewModels für die Menüpunkte. Die packst du dann in eine ObservableCollection und bindest diese Liste an ein ItemsControl. Siehe die Beispiele in [Artikel] MVVM und DataBinding, Abschnitt 2.4 ViewModel-Auflistungen bzw. Strg-F "ItemsControl".
Weeks of programming can save you hours of planning
private Nachricht | Beiträge des Benutzers
Mallett
myCSharp.de - Member



Dabei seit:
Beiträge: 176

Themenstarter:

beantworten | zitieren | melden

Danke, werd ich mir mal anschauen. Ich habs zwar in der Zwischenzeit bereits mit einem Itemscontrol umgesetzt, das bindet aber an eine Collection mit Usercontrols zur Zeit. Wäre sicher schöner, wenn ich das mit der verlinkten Lösung hinbekäme.
private Nachricht | Beiträge des Benutzers