本人來說我不喜歡的DataGrid得多。是的,它們更容易綁定,它們提供了內置的調整大小和排序選項,但它們不如在對象上具有良好DataTemplating的ItemsControl那麼靈活。讓我解釋一下自己。
我傾向於使用ObservableCollection填充ItemsControl。然後,我使用DataTemplate爲了告訴我的ItemsControl如何顯示我的自定義項目。
如果您在做MVVM,那麼您的CustomObjects可以是Modeles對象。 如果您的列表綁定到ObservableCollection,則添加和刪除的項目將動態顯示到您的列表中,這是我相信您嘗試執行的操作。 對於列大小,可以將指定GridColumns寬度的Grid指定爲某些列的固定寬度,對其他列指定*,以便填充剩餘空間。
這是GridView的替代方法 我在ItemControl上使用了一個ScrollViewer,所以如果ItemsControl太大,可以滾動它。 ItemsControl的ItemsSource綁定到你的FireAlarms的ObservableCollection。 ItemsControl中的WrapPanel將包含每個DataTemplate。這是(如果你願意或祖先)寬度爲綁定到他的父母是一個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一樣在Table中使用,你可以使用面向垂直的堆棧面板來修改它,並使用一個帶有變量//不變的列寬的網格,但是因爲你要求任何有用的東西,所以我很堅強,一些有趣的工作!
享受!
來源
2011-06-28 20:32:17
Gab
WPF中的所有東西似乎至少比應該需要的複雜10倍。 –