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?
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, ....