8

在 Windows 8 的 Metro 风格应用程序中,我将 Listview 绑定到 ObservableCollection,我希望每个 ListViewItem 的背景颜色交替显示(白色、灰色、白色等)

   <ListView x:Name="stopsListView" ItemsSource="{Binding}" >
        <ListView.ItemTemplate>
            <DataTemplate>
                <Grid Height="66" >
                    <TextBlock Text="{Binding Title}" />
                </Grid>
            </DataTemplate>
        </ListView.ItemTemplate>

在 WPF 中,这是使用带有触发器的样式完成的 - 请参阅此页面

您如何在 Metro 应用程序中完成此操作?

更新:

在下面给出正确答案后,我离开并实际编码了它。这里有一些代码供任何需要它的人使用:

值转换器类的代码:

public class AltBackgroundConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, string language)
    {
        if (!(value is int)) return null;
        int index = (int)value;

        if (index % 2 == 0)
            return Colors.White;
        else
            return Colors.LightGray;
    }

    // No need to implement converting back on a one-way binding
    public object ConvertBack(object value, Type targetType, object parameter, string language)
    {
        throw new NotImplementedException();
    }
}

XAML 列表视图的代码:

    <ListView x:Name="stopsListView" ItemsSource="{Binding}">

        <ListView.ItemTemplate>
            <DataTemplate>
                <Grid Width="250" Height="66" Margin="5">
                    <Grid.Background>
                        <SolidColorBrush Color="{Binding IndexWithinParentCollection, Mode=OneWay, Converter={StaticResource AltBGConverter}}" />
                    </Grid.Background>

...并且,在向集合中添加项目或修改集合时,请记住在集合中设置它们的索引:

myCollection.add(item);
item.IndexWithinParentCollection = myCollection.Count;

当然,如果您的集合经常更改,这种方法的维护成本很高,因为您必须重新索引您的项目,所以我发现在每个项目中存储对父集合的引用更容易,然后计算索引-the-fly 使用 .IndexOf() 避免每次集合更改时都必须不断更新索引值。

4

4 回答 4

5

您可以使用转换器 - 从项目中获取行索引并将其转换为画笔。此外 - 如果 ItemTemplate 没有给您足够的控制权 - 使用 ItemContainerStyle 在 ListViewItem 模板级别修改画笔。

另一种选择可能是指定一个 ItemTemplateSelector,它根据项目为您提供具有不同画笔的不同模板。您仍然需要生成行索引,或者以某种方式启用选择器来确定项目是在偶数还是奇数位置。

于 2012-08-17T17:18:49.453 回答
3

我相信这里的代码示例很有用 https://msdn.microsoft.com/en-us/library/ms750769(v=vs.85).aspx

于 2015-03-30T16:10:45.673 回答
1

从来没有尝试过这样的造型,但如果:

您将背景颜色绑定到某个属性,该属性将根据列表视图中当前项目的索引通过 IValueConverter 设置。

如果我有任何意义。

编辑:

有趣的是,当我写答案时,Filip Skakun 提出了完全相同的想法。

于 2012-08-17T17:21:09.753 回答
0

我在网上搜索并找到了一种技术,其中包括将索引属性添加到相关模型中,然后将转换器添加到 DataTemplate。这并不理想,因为它只更改了列表项的内容,因此根据填充和内容对齐,您会看到行背景周围的间隙。我也不喜欢用 UI 代码修改我的数据模型对象的代码味道。

试试这个它会有所帮助, http://www.bendewey.com/index.php/523/alternating-row-color-in-windows-store-listview

于 2015-06-08T13:19:10.707 回答