WinRT硬编码ListViewItem与DataTemplate,为什么它们看起来/工作不一样?

时间:2013-07-11 08:13:09

标签: xaml listview data-binding windows-runtime datatemplate

我是WinRT的新手,如果这是一个愚蠢的问题,请道歉。我创建了以下ListView:

<ListView x:Name="MyListView1" 
        Grid.Row="1" 
        Margin="120,300,0,0" 
        Width="500" 
        HorizontalAlignment="Left">

    <ListViewItem Background="DodgerBlue">

        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="200" />
                <ColumnDefinition Width="300" />
            </Grid.ColumnDefinitions>

            <TextBlock Text="hardcoded value 1" Grid.Column="0"></TextBlock>
            <TextBlock Text="hardcoded value 2" Grid.Column="1"></TextBlock>

        </Grid>

    </ListViewItem>
</ListView>

这看起来像我希望它看起来的方式,如果你点击一个项目,它将选择整行。但是,如果我将其移动到DataTemplate中,它看起来不一样,并且您不能再单击整行。 (如果我添加一个带有目标类型ListViewItem的ItemContainerStyle并将背景设置为黄色,它将填充它以使其与硬编码ListItem的大小相同,但是您只能单击黄色轮廓以选择它。)这是代码:

<ListView x:Name="MyListView2" 
        ItemTemplate="{StaticResource MyTemplate}" 
        ItemsSource="{Binding MyData}"
        Grid.Row="1" 
        Margin="120,0,0,0" 
        Width="500" 
        HorizontalAlignment="Left">

</ListView>

在StandardStyles.xaml中:

<DataTemplate x:Key="MyTemplate">

    <ListViewItem Background="DodgerBlue">

        <Grid>

            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="200" />
                <ColumnDefinition Width="300" />
            </Grid.ColumnDefinitions>

            <TextBlock Text="{Binding MyDataOne}" Grid.Column="0"></TextBlock>
            <TextBlock Text="{Binding MyDataTwo}" Grid.Column="1"></TextBlock>

        </Grid>

    </ListViewItem>
</DataTemplate>

我不明白为什么他们看起来/工作不一样 - 绑定它时不应该填充完全相同的代码吗?我需要做些什么来使其发挥作用?

1 个答案:

答案 0 :(得分:2)

问题在于您创建datatemplate的方式。请记住,ListViewItem是添加到需要在列表中显示的任何对象的包装器,因此当您创建包含listviewitem的datatemplate时,您基本上将对象包装两次。您需要做的就是从datatemplate中删除listviewitem元素

<DataTemplate x:Key="MyTemplate">

    <Grid Background="DodgerBlue">

        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="200" />
            <ColumnDefinition Width="300" />
        </Grid.ColumnDefinitions>

        <TextBlock Text="{Binding MyDataOne}" Grid.Column="0"></TextBlock>
        <TextBlock Text="{Binding MyDataTwo}" Grid.Column="1"></TextBlock>

    </Grid></DataTemplate>