我有一个Grid
定义为
<Grid DockPanel.Dock="Top" x:Name="grdFilter" Margin="40 10">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="*"/>
<RowDefinition Height="*"/>
<RowDefinition Height="*"/>
<RowDefinition Height="*"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<StackPanel Grid.ColumnSpan="3" Grid.Row="5" Orientation="Horizontal"
Margin="5" HorizontalAlignment="Center">
<Button Content="Apply"
Margin="0 0 2 0"
Style="{StaticResource MyButtonStyle}"
Command="{Binding ApplyFilterCommand}"/>
<Button x:Name="btnCancelFilter"
Margin="2 0 0 0"
Content="Cancel"
Style="{StaticResource MyButtonStyle}"
Click="btnCancelFilter_Click" />
</StackPanel>
</Grid>
我的ViewModel中有一个ObservableCollection<string>
,它定义了一个字符串列表来过滤一些数据。我想使用复选框和标签在ObservableCollection
中的Grid
单独的单元格中显示每个项目。我意识到有可能存在有限数量的细胞;我现在并不担心。
如果我对这些项目进行硬编码,我就会重复对网格的每个单元格的复选框和标签的定义
<DockPanel Grid.Column="0" Grid.Row="0">
<CheckBox x:Name="filterCheckbox"
Command="SomeFilterCommand">
<CheckBox.LayoutTransform>
<ScaleTransform ScaleX="3" ScaleY="3"/>
</CheckBox.LayoutTransform>
</CheckBox>
<Label Content="Filter 1" />
</DockPanel>
<DockPanel Grid.Column="1" Grid.Row="0">
<CheckBox x:Name="filterCheckbox"
Command="SomeFilterCommand">
<CheckBox.LayoutTransform>
<ScaleTransform ScaleX="3" ScaleY="3"/>
</CheckBox.LayoutTransform>
</CheckBox>
<Label Content="Filter 2" />
</DockPanel>
等...我想也许我可以创建一个DataTemplate
并以某种巫毒的方式将其打入Grid
,但我不知道该怎么做或者它是什么&#39甚至可能。
这是我的DataTemplate
<DataTemplate x:Key="FilterTemplate">
<DockPanel>
<CheckBox x:Name="filterCheckbox"
Tag="{Binding Mode=OneWay}"
Command="SomeFilterCommandFromBindings">
<CheckBox.LayoutTransform>
<ScaleTransform ScaleX="3" ScaleY="3"/>
</CheckBox.LayoutTransform>
</CheckBox>
<Label Content="{Binding Mode=OneWay}" />
</DockPanel>
</DataTemplate>
有没有其他方法可以使用模板逐个加载项目集合到网格中?或者我可以使用的其他控件?
答案 0 :(得分:1)
网格不能用作ItemsPanel模板,但是统一网格可以使用,但不是那么灵活,但通常可以在这种情况下完成工作
<ItemsControl>
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<UniformGrid Columns="3"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<DockPanel>
<!-- Template here -->
</DockPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
您还可以使用ListBox或ListView,具体取决于所需的功能;例如,ItemsControl没有scrollviewer或SelectedItem,但是如果你只需要显示数据,那么就可以使用ItemxControl了。