我个人不太喜欢 DataGrid。是的,它们更容易绑定,并且它们提供内置的调整大小和排序选项,但它们不像 ItemsControl 那样灵活,并且在您的对象上具有良好的 DataTemplating。让我自己解释一下。
我倾向于使用 ObservableCollection 填充我的 ItemsControl。然后,我使用 DataTemplate 来告诉我的 ItemsControl 如何显示我的自定义项目。
如果您使用 MVVM,您的 CustomObjects 可以是 Modeles 对象。
如果您的列表绑定到 ObservableCollection,添加和删除的项目将动态显示在您的列表中,我相信您正在尝试这样做。
对于列大小,您可以将 Grid 指定为 GridColumns 宽度,以固定 Width 用于某些列,将 * 用于其他列,以便它们填充剩余空间。
这是 GridView 的替代方案
我在 ItemControl 周围使用 ScrollViewer,因此如果 ItemsControl 太大,您可以滚动它。
ItemsControl 的 ItemSource 绑定到 FireAlarms 的 ObservableCollection。
ItemsControl 中的 WrapPanel 将包含每个 DataTemplate。它的 Width 绑定到他的父级(或祖先,如果你愿意的话),它是一个 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 放在 Windows 的资源或 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 这样的表格中,您可以使用垂直方向的堆栈面板对其进行修改,并使用具有可变列宽的网格 // 不变的列宽,但是由于您要求任何有用的东西,我很难告诉您一些有趣的工作!
享受吧!