Лично я не очень люблю DataGrid.Да, их проще связывать, и они предлагают встроенные параметры изменения размера и сортировки, но они не так гибки, как ItemsControl, с хорошим DataTemplating для ваших объектов.Позвольте мне объяснить.
Я стремлюсь заполнить свой ItemsControl ObservableCollection.Затем я использую DataTemplate, чтобы сообщить своему ItemsControl, как отображать мои пользовательские элементы.
Ваши объекты CustomObject могут быть объектами Modeles, если вы используете MVVM.Если ваш список привязан к коллекции ObservableCollection, добавленные и удаленные элементы будут динамически появляться в вашем списке, и я верю, что вы пытаетесь это сделать.Для размера столбца вы можете поместить Grid с указанием ширины GridColumns к фиксированной ширине для некоторых столбцов и * для других, чтобы они заполняли оставшееся пространство.
Вот альтернатива GridView. Я использую ScrollViewer вокруг моего ItemControl, поэтомуесли ItemsControl становится слишком большим, вы можете прокрутить его.ItemSontrol ItemsControl связан с ObservableCollection вашего FireAlarms.WrapPanel в ItemsControl будет содержать каждый шаблон данных.Это ширина привязана к его родителю (или предку, если хотите), который является ItemsControl
<ScrollViewer
Grid.Row="x"
Grid.Column="y"
VerticalScrollBarVisibility="Auto"
Margin="5">
<ItemsControl
BorderBrush="DarkBlue"
BorderThickness="2"
ItemsSource="{Binding Path=FireAlarms}"
ItemTemplate="{StaticResource FireAlarmsTemplate}"
>
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel
Orientation="Horizontal"
Width="{Binding RelativeSource=
{RelativeSource FindAncestor,
AncestorType={x:Type ItemsControl}},
Path=ActualWidth}"
>
</WrapPanel>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
</ScrollViewer>
Хорошо, тогда вам нужен DataTemplate.Вы можете поместить DataTemplate в ресурсы вашего окна или в DataDictionnary.Допустим, у вас есть класс:
FireAlarm
{
Public String AlarmInfo1;
Public String AlarmInfo2;
Public String AlarmInfo3;
}
Вот хороший пример DataTemplate, с которого можно начать:
<DataTemplate x:Key="FireAlarms">
<Border
BorderBrush="SteelBlue"
Background="LightBlue"
BorderThickness="2"
Margin="10"
Padding="10">
<StackPanel
Orientation="Vertical"
>
<Grid>
<Grid.RowDefinitions>
<RowDefinition></RowDefinition>
<RowDefinition></RowDefinition>
<RowDefinition></RowDefinition>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition></ColumnDefinition>
<ColumnDefinition Width="5"></ColumnDefinition>
<ColumnDefinition></ColumnDefinition>
</Grid.ColumnDefinitions>
<Label
Grid.ColumnSpan="3"
Grid.Row="0"
Content="{Binding Path=AlarmName}"
Margin="5,-5,5,10"
FontWeight="Bold"
FontSize="16"
HorizontalContentAlignment="Center"
HorizontalAlignment="Center">
</Label>
<TextBlock
Text="Alarm information 1" Grid.Row="1" Grid.Column="0" />
<TextBox
Text="{Binding Path=AlarmInfo1}"
Grid.Column="2"
Grid.Row="1"
>
</TextBox>
<TextBlock
Text="Alarm information 2" Grid.Row="2" Grid.Column="0" />
<TextBox
Text="{Binding Path=AlarmInfo2}"
Grid.Column="2"
Grid.Row="2"
>
</TextBox>
<TextBlock
Text="Alarm information 3" Grid.Row="3" Grid.Column="0" />
<TextBox
Text="{Binding Path=AlarmInfo3}"
Grid.Column="2"
Grid.Row="3"
>
</TextBox>
</Grid>
</StackPanel>
</Border>
</DataTemplate>
Хорошо, надеюсь, это полезно для вас.Мой шаблон будет генерировать 1 квадрат на тревогу.Если бы вы предпочли иметь его в таблице, такой как GridView, вы можете изменить это, используя вертикально ориентированную панель стека, и использовать сетку с переменной // неизменяемой шириной столбца, но, поскольку вы попросили что-нибудь полезное, я бы вас обманул.что-то интересное для работы!
Наслаждайтесь!