Неверное расположение UniformGrid в ItemControl
Я пишу змейку и хочу сделать поле адаптивным. Для этого я использую ItemsControl в котором у меня есть UniformGrid, которому через привязку передаю нужное количество столбцов и строчек. У меня,во-первых не реагируют стили и не фасуются по гридам данные.
XAML:
<Border Grid.Row="1" BorderThickness="4" BorderBrush="White" >
<ItemsControl Background="#3A4047" ItemsSource="{Binding FieldView}" HorizontalAlignment="Center" VerticalAlignment="Center" >
<ItemsControl.ItemTemplate>
<DataTemplate>
<Border Width="20" Height="20" Margin="1" Background="Black" >
<Border.Style>
<Style TargetType="Border">
<Style.Triggers>
<DataTrigger Binding="{Binding State}" Value="Snake">
<Setter Property="BorderBrush" Value="Blue"/>
<Setter Property="Background" Value="DodgerBlue"/>
</DataTrigger>
<DataTrigger Binding="{Binding State}" Value="Food">
<Setter Property="BorderBrush" Value="Red"/>
<Setter Property="Background" Value="LightPink"/>
<Setter Property="CornerRadius" Value="9"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Border.Style>
</Border>
</DataTemplate>
</ItemsControl.ItemTemplate>
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<UniformGrid Rows="{Binding DataContext.Height, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}"
Columns="{Binding DataContext.Width, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}"></UniformGrid>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
Код:
public ObservableCollection<ObservableCollection<Cell>> Field { get; set; }
public ObservableCollection<Cell> FieldView { get; set; } = new ObservableCollection<Cell>();
public int Width
{
get { return Field[0].Count; }
}
public int Height
{
get { return Field.Count; }
}
Field - двумерный массив. FieldView - преобразованный в одномерный.
Хранимый объект:
public class Cell : INotifyPropertyChanged
{
public Cell(CellState CState)
{
State = CState;
}
private CellState state;
public CellState State
{
set
{
state = value;
OnPropertyChenget();
}
get { return state; }
}
private void OnPropertyChenget([CallerMemberName] string prop = "")
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(prop));
}
public event PropertyChangedEventHandler PropertyChanged;
}