在WP中从代码隐藏更改列表视图所选项的前景颜色

时间:2014-09-10 16:12:26

标签: c# xaml listview windows-phone windows-phone-8.1

我正在尝试从后面的代码更改列表视图的前景色但我得到对象引用未设置为对象异常的实例
这是我的代码;

var item = listViewTest.SelectedItem;
ListViewItem listViewItem = this.listViewTest.ContainerFromItem(item) as ListViewItem;
listViewItem.Foreground = new SolidColorBrush(Colors.GreenYellow);

//manually scrolling to the selected item
listViewTest.ScrollIntoView(listViewTest.SelectedItem);

从代码中可以看出,我想要的是将前景色更改为例如黄色,然后滚动到该特定列表视图项。滚动工作,但前景色不起作用,我得到例外。

更新

这是项目模板;

            <ListView.ItemTemplate>
                <DataTemplate>
                    <StackPanel Margin="0,0,0,9.5">
                        <TextBlock
                            FontFamily="Times New Roman"
                            Text="{Binding Id}"
                            HorizontalAlignment="Right"
                            Pivot.SlideInAnimationGroup="1"
                            CommonNavigationTransitionInfo.IsStaggerElement="True"
                            Style="{StaticResource ListViewItemTextBlockBlackStyle}"/>
                        <TextBlock
                            Text="{Binding FullInfo}"
                            HorizontalAlignment="Right"
                            Pivot.SlideInAnimationGroup="2"
                            CommonNavigationTransitionInfo.IsStaggerElement="True"
                            Style="{StaticResource ListViewItemSubheaderTextBlockBlackStyle}"/>
                    </StackPanel>
                </DataTemplate>
            </ListView.ItemTemplate>

更新2

这是显示ContainerFromItem null的调试器 enter image description here

2 个答案:

答案 0 :(得分:1)

listViewTest.ContainerFromItem(item)返回null的原因是

  1. 尚未呈现的容器
  2. 找不到任何项目
  3. 容器项目在列表视图中不可见(可能需要滚动查看该项目)
  4. 解决方案

    致电listViewTest.ScrollIntoView(listViewTest.SelectedItem);

    之前

    调用等待System.Threading.Tasks.Task.Delay(1);让listview先加载。然后只调用scrollToView()

    另一个解决方案是自己添加项目,以便您可以listViewTest.Items[listViewTest.SelectedIndex]访问容器并设置前景

    编辑

    要手动添加项目,只需循环播放您的项目并调用此方法。

        private void AddItem(Foo f)
        {
            ListViewItem lvi = new ListViewItem();
            StackPanel sp = new StackPanel();
            TextBlock tb_id = new TextBlock();
            tb_id.Text = f.Id;
            // Set your other proerty here
            sp.Children.Add(tb_id);
    
            TextBlock tb_fullInfo = new TextBlock();
            tb_fullInfo.Text = f.FullInfo;
            // Set your other property here
            sp.Children.Add(tb_fullInfo);
    
            lvi.Content = sp;
            listViewTest.Items.Add(lvi);
        }
    

    当然,您需要设置其他属性,如字体系列等。

答案 1 :(得分:0)

您可以使用以下代码更改所选项目的前景色

private void connecteditems_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        ListViewItem item = (sender as ListView).SelectedItem;
        item.Foreground = new SolidColorBrush(Colors.Red);
    }