Обновить индекс в списке <string> - PullRequest
0 голосов
/ 01 июня 2018

У меня есть listBox, который содержит элементы со значениями из двух отдельных списков NameList & DescriptionList.

, когда я выбираю элемент, он отображает некоторую информацию, такую ​​как «имя» и «описание» из элементав выбранном индексе.

Если я удаляю одну строку сверху, все строки будут портиться по индексу и будут показывать неправильные значения.Можете ли вы обновить индекс list<string>?

Я пытался использовать Label.Content = NameList[listBox.SelectedItem];, но он просто дает аргумент 1: невозможно преобразовать из 'object' в 'int'.

Редактировать 1

private void ListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    List<string> CallNameList = Control.NameList;
    List<string> CallDescList = Control.DescriptionList;

    if (listBox.SelectedIndex < 0)
    {
        TextLabel.Text = "Please select another item";
    }
    else
    {
        TitelLabel.Content = CallNameList[listBox.SelectedIndex]; 
        TextLabel.Text = CallDescList[listBox.SelectedIndex]; 
    }
}

Как вы можете видеть в первой сцене, у меня есть номера 1-2-3-4.Здесь он отображает 1, когда я выбрал 1. Picture two

Однако, когда я удаляю 1 и затем выбираю 3, как на рисунке, он выводит это как 2 Picture one

Это потому, что индекс падает на единицу для всех.Создание объекта 3 -> объект 2 и т. Д.

Как я могу решить эту проблему?

Ответы [ 2 ]

0 голосов
/ 01 июня 2018

Я бы предложил вам использовать DataBinding.Использование индекса и синхронизация с ним двух списков ... не очень удобно.

Мы можем считать, что у вас есть объекты, связанные с вашей датой.Поэтому я создал класс:

public class CustomDate
{
    public string name { get; set; }
    public string description { get; set; }
    public CustomDate(string iName, string iDescription)
    {
        this.name = iName;
        this.description = iDescription;
    }
}

Затем я использовал ObservableCollection для обработки этих объектов.Он похож на List, но очень легко справится с добавлением / удалением элементов.

public partial class MainWindow : Window
{
    ObservableCollection<CustomDate> CallNameList = new ObservableCollection<CustomDate>();

    public MainWindow()
    {
        InitializeComponent();

        CallNameList.Add(new CustomDate("Date #1", "Description of first date"));
        CallNameList.Add(new CustomDate("Date #2", "This is a fantastic date"));
        CallNameList.Add(new CustomDate("Date #3", "It will rain today"));

        MyList.DataContext = CallNameList;
    }

    private void Delete_Click_1(object sender, RoutedEventArgs e)
    {
        CallNameList.Remove((CustomDate)MyList.SelectedItem);
    }
}

А вот и часть XAML / WPF.Вы должны сосредоточиться на части DataBinding.Если вы не знакомы с ним, вы должны найти и прочитать некоторые учебные пособия.WPF без DataBinding бессмысленен.

<Window x:Class="StackTest.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:StackTest"
    mc:Ignorable="d"
    Title="Laser Control " Height="300" ResizeMode="CanMinimize" Cursor="Arrow" Width="400">

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition />
        <ColumnDefinition />
    </Grid.ColumnDefinitions>
    <Grid Grid.Column="0">
        <Grid.RowDefinitions>
            <RowDefinition/>
            <RowDefinition Height="30"/>
        </Grid.RowDefinitions>
        <ListBox Name="MyList" ItemsSource="{Binding}">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding name}"/>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
        <Button Name="Delete" Click="Delete_Click_1" Grid.Row="1" Content="Delete current date"/>
    </Grid>
    <Grid Grid.Column="1">
        <Grid.RowDefinitions>
            <RowDefinition/>
            <RowDefinition/>
        </Grid.RowDefinitions>
        <TextBlock Grid.Row="0" HorizontalAlignment="Center" Text="{Binding ElementName=MyList, Path=SelectedItem.name}"/>
        <TextBlock Grid.Row="1" HorizontalAlignment="Center" Text="{Binding ElementName=MyList, Path=SelectedItem.description}"/>
    </Grid>
</Grid>

</Window>

Этот способ не единственный, но я считаю его очень удобным, поскольку DataBinding позаботится обо всем для меня.И было бы очень легко добавить больше информации или изменить пользовательский интерфейс, не изменяя логику, стоящую за ним.

0 голосов
/ 01 июня 2018

Я почти уверен, что ошибка в том, что вы пытаетесь использовать SelectedItem (объект) вместо SelectedIndex (int)

  Label.Content = NameList[listBox.SelectedIndex];

или вы можете просто получить значение из SelectedItem

  Label.Content = listBox.SelectedItem.ToString();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...