Laden...

Usercontrols dynamisch hinzufügen / entfernen

Erstellt von Mallett vor 4 Jahren Letzter Beitrag vor 4 Jahren 915 Views
M
Mallett Themenstarter:in
171 Beiträge seit 2012
vor 4 Jahren
Usercontrols dynamisch hinzufügen / entfernen

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.

5.657 Beiträge seit 2006
vor 4 Jahren

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

M
Mallett Themenstarter:in
171 Beiträge seit 2012
vor 4 Jahren

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.