我正在尝试从后面的代码更改列表视图的前景色但我得到对象引用未设置为对象异常的实例。
这是我的代码;
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>
这是显示ContainerFromItem
null的调试器
答案 0 :(得分:1)
listViewTest.ContainerFromItem(item)
返回null的原因是
致电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);
}