Я бы использовал прикрепленное поведение в отличие от низкоуровневой настройки для ItemsControl.
Если все, что вам нужно, это матричный элемент управления - вы можете рассмотреть возможность использования Grid для строк вместо ItemsControl (с этим мы и столкнулись). ItemsControl - безгранично мощное существо, но иногда это может быть проблемой, чтобы выжать маленькое, но полезное дополнительное будущее благодаря своему звуковому дизайну.
Изменения, которые вы должны будете сделать, используя этот подход:
1. Используйте Dimension и привяжите его к размеру, который вы хотите.
2. Создайте пользовательский шаблон ItemTemplate и добавьте GridEx.Position к его корневому визуальному объекту, связанному со свойством Relvant Point.
На этих двух, просто напишите нам, и я обновлю свой ответ более подробной информацией.
вот класс:
public class GridEx
{
public static DependencyProperty DimensionProperty =
DependencyProperty.Register("Dimension",
typeof(Size),
typeof(Grid),
new PropertyMetadata((o, e) =>
{
GridEx.OnDimensionChanged((Grid)o, (Size)e.NewValue);
}));
public static DependencyProperty PositionProperty =
DependencyProperty.Register("Position",
typeof(Point),
typeof(UIElement),
new PropertyMetadata((o, e) =>
{
GridEx.OnPostionChanged((UIElement)o, (Point)e.NewValue);
}));
private static void OnDimensionChanged(Grid grid, Size resolution)
{
grid.RowDefinitions.Clear();
grid.ColumnDefinitions.Clear();
for (int i = 0; i < resolution.Width; i++)
{
grid.ColumnDefinitions.Add(new ColumnDefinition());
}
for (int i = 0; i < resolution.Height; i++)
{
grid.RowDefinitions.Add(new RowDefinition());
}
}
private static void OnPostionChanged(UIElement item, Point position)
{
Grid.SetColumn(item, Convert.ToInt32((position.X)));
Grid.SetRow(item, Convert.ToInt32(position.Y));
}
public static void SetDimension(Grid grid, Size dimension)
{
grid.SetValue(GridEx.DimensionProperty, dimension);
}
public static Size GetDimension(Grid grid)
{
return (Size)grid.GetValue(GridEx.DimensionProperty);
}
public static void SetPosition(UIElement item, Point position)
{
item.SetValue(GridEx.PositionProperty, position);
}
public static Point GetPosition(Grid grid)
{
return (Point)grid.GetValue(GridEx.PositionProperty);
}
}
А вот как мы это используем:
<Window x:Class="GridDefs.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:GridDefs"
Title="MainWindow" Height="350" Width="525">
<Grid local:GridEx.Dimension="3,3">
<Button local:GridEx.Position="0,0">A</Button>
<Button local:GridEx.Position="1,1">A</Button>
<Button local:GridEx.Position="2,2">A</Button>
</Grid>
</Window>