尝试使用ContainerFromIndex()获取ListView的子项时返回null



我正在尝试选中ListView:中的复选框

Grid specialGrid = (Grid) listView1.ContainerFromIndex(index);
CheckBox specialBox = (CheckBox) specialGrid.FindName("Special");
specialBox.IsChecked = true;
<ListView x:Name="listView1">
<ListView.ItemTemplate>
<DataTemplate x:DataType="x:String">
<Grid x:Name="LineW">
<CheckBox x:Name="Special" Grid.Column="1" Checked="Special_Checked" Unchecked="Special_Unchecked"/>

这是我的ListView。但是调用ContainerFromIndex((会返回null,即使该项存在(当然,只要我删除了崩溃的原因(,我也不知道出了什么问题。我试着打电话给

int number = listView1.Items.Count;

在此之前,由于某种原因,它返回0。但我确实向ObservableCollection添加了内容,如果我删除了导致崩溃的代码,它就会正确显示。

编辑:我已经做了更多的实验,在我尝试访问视图时,它似乎没有被渲染。但如果我等待并稍后添加,如果有人在时间结束前点击复选框,它可能会出错。有没有一种方法可以在计算完视图后立即执行,但在与视图交互之前执行?

您需要将您的ObservableCollection提供给列表视图的ItemSource属性。x: 无法访问模板中具有的名称。看看下面的例子

/*Xaml Code*/
<Page
x:Class="App1.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:App1"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<Grid>
<ListView ItemsSource="{x:Bind items,Mode=OneWay}">
<ListView.ItemTemplate>
<DataTemplate x:DataType="local:Item">
<StackPanel Orientation="Horizontal">
<CheckBox IsChecked="{x:Bind is_checked}"></CheckBox>
<TextBlock Text="{x:Bind text}"></TextBlock>
</StackPanel>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</Grid>
</Page>    
//C# code
namespace App1
{
public sealed partial class MainPage : Page
{
ObservableCollection<Item> items;
public MainPage()
{
items = new ObservableCollection<Item>();
items.Add(new Item() { is_checked = true, text = "item1" });
items.Add(new Item() { is_checked = true, text = "item2" });
items.Add(new Item() { is_checked = false, text = "item3" });
this.InitializeComponent();
}

}
public class Item
{
public   bool is_checked { get; set; }
public  string text { get; set; }
}
}

编辑要获取具有特定文本的项目,请使用LINQ。检查下方的样本代码

public Int32 getindexofitem()
{
var index = items.IndexOf(items.Single(g => g.text == "item2"));
return index;
} 

最新更新