【问题标题】:WinRT hardcoded ListViewItem vs. DataTemplate, why do they not look/work the same?WinRT 硬编码 ListViewItem 与 DataTemplate,为什么它们看起来/工作不一样?
【发布时间】:2013-07-09 10:10:56
【问题描述】:

我是 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>

我不明白为什么它们看起来/工作方式不同 - 绑定时不应该填充完全相同的代码吗?我需要做什么才能让它发挥作用?

【问题讨论】:

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


    【解决方案1】:

    问题在于您创建数据模板的方式。请记住,ListViewItem 是添加到需要在列表中显示的任何对象的包装器,因此当您创建包含 listviewitem 的数据模板时,您基本上是将该对象包装两次。您需要做的就是从数据模板中删除 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>
    

    【讨论】:

    • 当然,现在完全有道理。太感谢了! (很抱歉迟到了,我在发布问题后的第二天就去度假了,才回来。)
    猜你喜欢
    • 2015-08-06
    • 2010-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-11
    • 2016-08-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多