Попытка получить дочерний элемент ListView с ContainerFromIndex () возвращает ноль - PullRequest
0 голосов
/ 01 декабря 2018

Я пытаюсь установить флажок в моем 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 () возвращает ноль, хотя элемент существует (конечно, если я устраню причину сбоя), я не понимаю, что происходит не так.Я пытался вызвать

int number = listView1.Items.Count;

до этого, и по какой-то причине он возвращает 0. Но я действительно добавил контент в ObservableCollection, и если я удаляю код, вызывающий сбой, он отображается правильно.

Редактировать: Я экспериментировал еще немного, и кажется, что представление не отображается в то время, когда я пытаюсь получить к нему доступ.Но если я подожду и добавлю это позже, это может вызвать ошибку, если кто-то нажмет на флажок, прежде чем время закончится.Есть ли способ сделать это сразу после вычисления представления, но до того, как с ним можно взаимодействовать?

1 Ответ

0 голосов
/ 01 декабря 2018

Вам необходимо передать свой 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;
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...