如何将DataTemplate应用于Collection中的每个项目到网格的单元格中

时间:2016-06-16 19:42:05

标签: wpf xaml mvvm

我有一个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>

有没有其他方法可以使用模板逐个加载项目集合到网格中?或者我可以使用的其他控件?

1 个答案:

答案 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了。