EvAlex 的上述答案将起作用,但前提是您不想使用数据绑定设置列/行数。
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());
}
}
}
如果您确实想通过数据绑定来设置这些(就像我一样),那么使用上述解决方案,编译器会抱怨,因为它需要这样做DependencyProperties
。ADependencyProperty
可以如下实现(使用 C# 6 的nameof
运算符)(插入它的快速方法是使用片段 propdp):
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));
但是这样你就不能执行必要的逻辑来添加必要数量的RowDefinitions
. 为了解决这个问题,DependencyPropertyDescriptor
为每个定义一个DependencyProperty
并在您的自定义类的构造函数中添加一个AddValueChanged
带有必要逻辑的调用。然后每个属性的结果是(使用 C# 6 的空条件运算符?.
):
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());
});
}