改变 ListView 的前景色

Changing Forecolor of ListView

我真的需要你的帮助,因为我找不到解决我的问题的方法!

我正在开发一个 Universal Windows 10 应用程序,其中有一个时间表 (ListView)。

现在我想在时间表中标记项目,目前是运行。例如,有一个从星期一 07:00 到 13:00 的项目,现在是星期一 12:00 所以该项目应该将其颜色更改为红色(或其他颜色),就像它被标记一样。

我现在已经尝试了几种方法,这就是目前的代码:

首先是我的 xaml-ListView 代码:

<RelativePanel Name="rpStundenplan">
        <ListView x:Name="lstViewStundenplan" HorizontalContentAlignment="Stretch" SelectionChanged="lstViewStundenplan_SelectionChanged">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <Grid>
                        <RelativePanel Grid.Row="0" Grid.Column="0">
                            <RelativePanel Name="rpTag" Width="100">
                                <TextBlock Name="txtTag" FontSize="16" Text="{Binding Tag_lang}" TextWrapping="Wrap" RelativePanel.AlignHorizontalCenterWithPanel="True" />
                            </RelativePanel>
                            <RelativePanel Name="rpZeit" Width="auto" RelativePanel.Below="rpTag" RelativePanel.AlignHorizontalCenterWith="rpTag">
                                <TextBlock Name="txtZeitVon" FontSize="14" Text="{Binding Beginn}" VerticalAlignment="Center"/>
                                <TextBlock Name="txtZeitBis" FontSize="14" Text="{Binding Ende}" VerticalAlignment="Center" RelativePanel.RightOf="txtZeitVon" Margin="5,0,0,0" />
                            </RelativePanel>
                      </Grid>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>
    </RelativePanel>

我正在用这段代码填充 ListView:

    private void StundenplanAktualisieren()
    {
        //Studiengänge aus integrierter Datenbank in ListView eintragen
        using (SQLite.Net.SQLiteConnection connIntern = new SQLite.Net.SQLiteConnection(new SQLite.Net.Platform.WinRT.SQLitePlatformWinRT(), sPathdatabaseIntern))
        {
            var query = connIntern.Table<Classes.Stundenplan>();

            //ListBox erste leeren
            this.lstViewStundenplan.Items.Clear();

            foreach (var item in query)
            {
                this.lstViewStundenplan.Items.Add(item);
            }
        }
    }

现在是出现错误的代码:

public void AktuelleZeit()
    {
        //markiert die aktive Vorlesung
        ListView lstView = new ListView();
        lstView = lstViewStundenplan;

        for (int i = 1; i < lstView.Items.Count; i++)
        {
                    ListViewItem Item = (ListViewItem)lstViewStundenplan.Items[i];

                    Item.Foreground = new SolidColorBrush(Windows.UI.Colors.Red);
        }

    }

可惜线

ListViewItem Item = (ListViewItem)lstViewStundenplan.Items[i];

抛出异常:

{"Unable to cast object of type 'CampusAppHSHof.Classes.Stundenplan' to type 'Windows.UI.Xaml.Controls.ListViewItem'."}

我希望代码足以让您重现问题...我尽量让它尽可能短...

通常我们不会直接操作ListView的item,通常的做法是将item添加到ObservableCollection,然后设置ListView的ItemSource属性绑定到ObservableCollection

根据问题,lstViewStundenplan.Items 获取用于生成 ListView 内容的集合。在您的项目中,集合中的项目是 Stundenplan 类型。所以你得到了例外:

{"Unable to cast object of type 'CampusAppHSHof.Classes.Stundenplan' to type 'Windows.UI.Xaml.Controls.ListViewItem'."}

您可以使用ItemsControl.ContainerFromItem获取指定项目对应的容器。您可以将其转换为 ListViewItem 类型。

顺便说一下,在 AktuelleZeit 方法中,代码 ListView lstView = new ListView(); lstView = lstViewStundenplan; 似乎是多余的。

例如:

public void AktuelleZeit()
{
    for (int i = 1; i < lstViewStundenplan.Items.Count; i++)
    {
        ListViewItem Item = (lstViewStundenplan).ContainerFromItem(lstViewStundenplan.Items[i]) as ListViewItem;
        Item.Foreground = new SolidColorBrush(Windows.UI.Colors.Red);
    }
}