Powyższa odpowiedź EvAlex będzie działać, ale tylko wtedy, gdy nie chcesz ustawiać liczby kolumn/wierszy przy użyciu powiązania danych.
public class GridEx : Grid
{
public int NumberOfRows
{
get { return RowDefinitions.Count; }
set
{
RowDefinitions.Clear();
for (int i = 0; i < value; i++)
RowDefinitions.Add(new RowDefinition());
}
}
public int NumberOfColumns
{
get { return ColumnDefinitions.Count; }
set
{
ColumnDefinitions.Clear();
for (int i = 0; i < value; i++)
ColumnDefinitions.Add(new ColumnDefinition());
}
}
}
Jeśli chcesz ustawić je poprzez wiązania danych (tak jak ja), to z powyższego roztworu kompilator będzie narzekać, ponieważ musi DependencyProperties
do tego. DependencyProperty
mogą być realizowane (przy użyciu C# 6 w nameof
operatora) w następujący sposób (szybki sposób, aby wstawić go używa propdp urywek):
public int Columns
{
get { return (int) GetValue(ColumnsDependencyProperty); }
set { SetValue(ColumnsDependencyProperty, value); }
}
public static readonly DependencyProperty ColumnsDependencyProperty =
DependencyProperty.Register(nameof(Columns), typeof(int), typeof(GridEx), new PropertyMetadata(0));
Ale w ten sposób nie można wykonać niezbędną logikę dodać niezbędne numer RowDefinitions
. Aby rozwiązać ten problem, zdefiniuj DependencyPropertyDescriptor
dla każdego DependencyProperty
i dodaj wywołanie AddValueChanged
z niezbędną logiką do swojego konstruktora klasy niestandardowej. Wynik za propery następnie (C# 6 jest zerem uzależnione od operatora ?.
):
public int Columns
{
get { return (int) GetValue(ColumnsDependencyProperty); }
set { SetValue(ColumnsDependencyProperty, value); }
}
public static readonly DependencyProperty ColumnsDependencyProperty =
DependencyProperty.Register(nameof(Columns), typeof(int), typeof(GridEx), new PropertyMetadata(0));
DependencyPropertyDescriptor ColumnsPropertyDescriptor = DependencyPropertyDescriptor.FromProperty(ColumnsDependencyProperty, typeof(GridEx));
public GridEx()
{
ColumnsPropertyDescriptor?.AddValueChanged(this, delegate
{
ColumnDefinitions.Clear();
for (int i = 0; i < Columns; i++)
ColumnDefinitions.Add(new ColumnDefinition());
});
}
Jak zdefiniowano lokalny –