Как перебрать ListView в UWP? - PullRequest
       14

Как перебрать ListView в UWP?

0 голосов
/ 05 апреля 2019

У меня есть ListView:

<ListView x:Name="lvVorlagen">
  <ListView.ItemContainerStyle>
     <Style TargetType="ListViewItem">
        <Setter Property="MinHeight" Value="1"/>
        <Setter Property="Height" Value="30"/>
     </Style>
  </ListView.ItemContainerStyle>
</ListView>

Я добавляю в него несколько предметов:

lvVorlagen.Items.Add("A");
lvVorlagen.Items.Add("B");
lvVorlagen.Items.Add("C");
lvVorlagen.Items.Add("D");

Как я могу пройтись по пунктам и проверить, проверяются ли они, или проверить их программно? Я привык к таким вещам, как

foreach (ListViewItem bla in this.lvVorlagen.Items)
{
  if (bla.IsSelected)
  {
    tbMail.Text = "ASD";
  }
}

Но тогда я получаю:

System.InvalidCastException: "Невозможно привести объект типа «System.String» для ввода «Windows.UI.Xaml.Controls.ListViewItem». "

Следующая попытка:

for (int i = 0; i < this.lvVorlagen.Items.Count; i++)
{
  if (this.lvVorlagen.Items[i].IsSelected)
  {
    tbMail.Text = "ASD";
  }
}

Но тогда у меня есть только Equals, ToString и т. Д. На this.lvVorlagen.Items[i].

Я много читал о связывании, но не знаю, как связать предметы с возможностью выбора.

Ответы [ 2 ]

0 голосов
/ 06 апреля 2019

Ответ от mm8 позволит вам перебрать ListItems.Другой подход заключается в использовании привязки данных с использованием ObservableCollection.Это упростит итерацию, потому что вы не перебираете элементы списка, вы перебираете коллекцию, привязанную к ListView.Для выбора просто посмотрите на MainList.SelectedItem, он оценит тип объекта (в данном случае строка).Я также добавил пример того, как изменить значение.Вы можете использовать выражение LINQ в ObservableCollection для достижения сортировки.

XAML

    <Grid Background="Transparent" Margin="15">
    <Grid.RowDefinitions>
        <RowDefinition Height="*" />
        <RowDefinition Height="Auto" />
    </Grid.RowDefinitions>
    <ListView x:Name="lvVorlagen"
              Margin="0,0,0,15"
              Foreground="Black"
              ItemsSource="{x:Bind LvVorlagen, Mode=OneWay}"
              HorizontalAlignment="Stretch"
              VerticalAlignment="Stretch">
        <ListView.ItemContainerStyle>
            <Style TargetType="ListViewItem">
                <Setter Property="MinHeight" Value="1"/>
                <Setter Property="Height" Value="30"/>
            </Style>
        </ListView.ItemContainerStyle>
        <ListView.ItemTemplate>
            <DataTemplate>
                <TextBlock  Text="{Binding}" />
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
    <Button x:Name="btnIterate" 
            Content="Iterate" 
            Grid.Row="1" 
            Height="40" 
            FontSize="18" 
            Background="Orange"
            Foreground="Black"
            HorizontalAlignment="Right" 
            Click="BtnIterate_Click"/>
    <Button x:Name="btnSelect" 
            Content="Select" 
            Grid.Row="1" 
            Height="40" 
            FontSize="18" 
            Background="LightBlue"
            Foreground="Black"
            HorizontalAlignment="Left"
            Click="BtnSelect_Click"/>
    <Button x:Name="btnChange" 
            Content="Change" 
            Grid.Row="1" 
            Height="40" 
            FontSize="18" 
            Background="LightGreen"
            Foreground="Black"
            HorizontalAlignment="Center"
            Click="BtnChange_Click"/> 
</Grid>

Код позади

  public sealed partial class MainPage : Page
{
    public MainPage()
    {
        this.InitializeComponent();

        LvVorlagen = new ObservableCollection<string>();
    }

    private void Page_Loaded(object sender, RoutedEventArgs e)
    {
        LvVorlagen.Add("A");
        LvVorlagen.Add("B");
        LvVorlagen.Add("C");
        LvVorlagen.Add("D");


    }

    public ObservableCollection<string> LvVorlagen
    {
        get;
        set;
    }

    private void BtnIterate_Click(object sender, RoutedEventArgs e)
    {
        foreach(string value in LvVorlagen)
        {
            Debug.WriteLine(value);
        }
    }

    private void BtnSelect_Click(object sender, RoutedEventArgs e)
    {
        if (MainList.SelectedItem != null)
        {
            Debug.WriteLine("Select Item is: " + MainList.SelectedItem.ToString());
        }
        else
        {
            Debug.WriteLine("No items are selected.");
        }
    }
    private void BtnChange_Click(object sender, RoutedEventArgs e)
    {
        int selectedIndex = MainList.SelectedIndex;
        LvVorlagen[selectedIndex] = "X";
    }
}
0 голосов
/ 05 апреля 2019

Вы можете использовать метод ContainerFromItem, чтобы получить ссылку на контейнер ListViewItem для определенного элемента:

foreach (object item in this.lvVorlagen.Items)
{
    ListViewItem lvi = this.lvVorlagen.ContainerFromItem(item) as ListViewItem;
    if (lvi != null && lvi.IsSelected)
    {
        tbMail.Text = "ASD";
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...