Laden...

Dynamisches Raster mit dem GridLayout

Erstellt von hypersurf vor 12 Jahren Letzter Beitrag vor 12 Jahren 1.798 Views
H
hypersurf Themenstarter:in
523 Beiträge seit 2008
vor 12 Jahren
Dynamisches Raster mit dem GridLayout

Hallo Leute,

ich möchte in meinem Programm ein Raster generieren in dessen Zellen dann per Drag&Drop Elemente eingefügt werden sollen.

Da das Gridlayout ja genau so ein Raster liefert, möchte ich dieses dafür verwenden:


    <Page.Resources>
        <DataTemplate DataType="{x:Type local:ViewModelRasterElement}">
            <TextBlock Text="{Binding Bezeichnung}"/>
        </DataTemplate>
    </Page.Resources>


<ItemsControl ItemsSource="{Binding RasterElemente}">
                <ItemsControl.ItemContainerStyle>
                    <Style>
                        <Setter Property="Grid.Row" Value="{Binding GridRow}" />
                        <Setter Property="Grid.Column" Value="{Binding GridColumn}" />
                    </Style>
                </ItemsControl.ItemContainerStyle>
                <ItemsControl.ItemsPanel>
                    <ItemsPanelTemplate>
                        <Grid ShowGridLines="True">
                            <Grid.RowDefinitions>
                                <RowDefinition />
                                <RowDefinition />
                                <RowDefinition />
                            </Grid.RowDefinitions>
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition />
                                <ColumnDefinition />
                                <ColumnDefinition />
                            </Grid.ColumnDefinitions>
                        </Grid>
                    </ItemsPanelTemplate>
                </ItemsControl.ItemsPanel>
            </ItemsControl>

Das ViewModel für die Elemente des Rasters:


    public class ViewModelRasterElement : BaseViewModel
    {
        private int _GridColumn;
        /// <summary>
        /// Spalte im Raster
        /// </summary>
        public int GridColumn
        {
            get { return _GridColumn; }
            set {
                _GridColumn = value;
                this.ValueChanged("GridColumn");
                }
        }

        private int _GridRow;
        /// <summary>
        /// Zeile im Raster
        /// </summary>
        public int GridRow
        {
            get { return _GridRow; }
            set {
                _GridRow = value;
                this.ValueChanged("GridRow");
                }
        }

        private string _Bezeichnung;
        public string Bezeichnung
        {
            get { return _Bezeichnung; }
            set { 
                    _Bezeichnung = value;
                    this.ValueChanged("Bezeichnung");
                }
        }

Auszug aus dem ViewModel welches die RasterElemente enthält:


        private ObservableCollection<ViewModelRasterElement> _RasterElemente;
        public ObservableCollection<ViewModelRasterElement> RasterElemente
        {
            get { return _RasterElemente; }
            set { 
                    _RasterElemente = value;
                    this.ValueChanged("RasterElemente");
                }
        }

        private void GenriereRasterElemente()
        {
            for (int zeile = 1; zeile <= this.RasterZeilen; zeile++)
            {
                for (int spalte = 1; spalte <= this.RasterSpalten; spalte++)
                {
                    ViewModelRasterElement element = new ViewModelRasterElement();
                    element.GridColumn = spalte - 1;
                    element.GridRow = zeile - 1;
                    element.Bezeichnung = "asdlkjaljksdf";
                    this.RasterElemente.Add(element);
                }
            }
        }

Das Generieren der Rasterelemente funktioniert soweit problemlos und alle Elemente werden in den richtigen Zellen angezeigt.

Jetzt zu meinen diversen Problemen/Fragen:

  • Ist es möglich, die Grid.RowDefinitions und Grid.ColumnDefinitions dynamisch und MVVM-konform zu erzeugen? Ich möchte die Größe des Rasters anhand bestimmter Kriterien vorgeben können.

  • Drag&Drop einzubinden ist generell kein Problem, ich habe nur gesehen, dass ich nicht direkt in die Gridzellen draggen kann, sondern dazu erst ein Element (z. B. irgendein Panel) in der Zelle sein muss auf das ich dann droppen kann. Ist das korrekt oder habe ich etwas übersehen?

109 Beiträge seit 2011
vor 12 Jahren

Hallo,

für die dynamische Größe des Grids findest du hier 2 Lösungsansätze: Wieso kann Grid nicht als ItemsPanel verwendet werden?

Um Rekursion zu verstehen, muss man erst mal Rekursion verstehen, muss man erst mal Rekursion verstehen, ....