Мой массив — это список имен покемонов, считанный из текстового файла, а затем сохраненный в массиве в классе PokemonData, показанном ниже.

        private string[] pokemonNames;
        private StreamReader readNames;

        public PokemonData()
        {
            readNames = new StreamReader(setDirectory() + @".\PokemonNames.txt");
            pokemonNames = new string[256];
            populateArray(pokemonNames, readNames);

        }

        public string[] populateArray(string[] pokemonNames, StreamReader readNames)
        {
            string pokemonName = readNames.ReadLine();
            int i = 0;
            while (pokemonName != null)
            {
                pokemonNames[i] = pokemonName.Trim();
                pokemonName = readNames.ReadLine();
                i++;
            }
            readNames.Close();
            return pokemonNames;
        }

        public string[] getPokemonNames()
        {
            return pokemonNames;
        }

Что я хочу сделать, так это заполнить поле со списком, используя WPF, со всеми именами внутри массива. Я пытался найти это в Google, и часто во многих ответах классы настраиваются примерно так:

Class ExampleClass {
    Public ExampleClass() {
         string PokemonName; {get; set;}
     }
}

Я полагаю, что здесь происходит задание, но я не уверен. C# не мой обычный язык, и я впервые создаю графический интерфейс. Может кто-нибудь, пожалуйста, направьте меня, чтобы я мог закончить это.

Я попытался сделать несколько вещей, таких как приведенный ниже код и привязка данных. На данный момент я считаю, что я что-то упускаю.

<Window
        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:StarterEdit"
        xmlns:Collections="clr-namespace:System.Collections;assembly=System.Runtime.Extensions" x:Class="StarterEdit.MainWindow"
        mc:Ignorable="d"
        Title="Starter Edit" Height="420" Width="550">
    <Grid Margin="0,0,0,11" HorizontalAlignment="Center" Width="530">
        <Label Content="Squirtle" HorizontalAlignment="Left" Margin="45,50,0,0" VerticalAlignment="Top" ToolTip="Starter One"/>
        <Label Content="Bulbasaur" HorizontalAlignment="Left" Margin="245,50,0,0" VerticalAlignment="Top" ToolTip="Starter Two"/>
        <Label Content="Charmander" HorizontalAlignment="Left" Margin="445,50,0,0" VerticalAlignment="Top" ToolTip="Starter Three"/>
        <ComboBox x:Name="NameList" HorizontalAlignment="Left" Margin="10,81,0,0" VerticalAlignment="Top" Width="120" IsReadOnly="True" SelectedIndex="0" Cursor="Arrow" IsTextSearchEnabled="True" ToolTip="List of Pokemon names">

        </ComboBox>
</Window>

Вот мой класс MainWindow

    public partial class MainWindow : Window
    {
        Dictionary<int, string> pokemonNames = new Dictionary<int, string>();
        PokemonData pokemonData = new PokemonData();

        public MainWindow()
        {
            InitializeComponent();

            NameList.ItemsSource = pokemonData.getPokemonNames(); //method that returns string array 
            NameList.ItemsSource = pokemonNames; //this is a dictionary
        }

    }

То, что я пытаюсь сделать, это использовать WPF. Я хочу заполнить свой comboBox данными из класса PokemonData, в частности, массивом, содержащим все имена. Проблема в том, что всякий раз, когда я связываю данные или устанавливаю данные, они никогда не отображаются в графическом интерфейсе или в поле со списком.

0
David 31 Мар 2020 в 19:56
Это wpf//winforms//asp?
 – 
Kevin DiTraglia
31 Мар 2020 в 20:00
Вы не указываете, какая у вас проблема. Вы также не показали, что такое getPokemonNames() (действительно ли это populateArray()?), и в вашем комментарии говорится, что pokemonNames - это словарь, хотя ваш предыдущий код показывает, что это массив. Однако setDirectory() + @".\PokemonNames.txt" будет проблематичным, потому что вы добавляете . ко всему, что возвращает setDirectory(). Это должно быть просто setDirectory() + @"\PokemonNames.txt" или, еще лучше, Path.Combine(setDirectory(), "PokemonNames.txt").
 – 
Lance U. Matthews
31 Мар 2020 в 20:00
МОФ
 – 
David
31 Мар 2020 в 20:04
2
Но в чем проблема? Имена не загружаются в ComboBox? Две строки, которые устанавливают NameList.ItemsSource, где они расположены и что их вызывает? Где используется этот класс PokemonData? Вам может потребоваться показать соответствующий XAML и код программной части Window, содержащий ComboBox.
 – 
Lance U. Matthews
31 Мар 2020 в 20:14
Поле со списком не отображает данные, которые я даю, вот и вся проблема. Я обновил свой пост, чтобы показать другой соответствующий код.
 – 
David
31 Мар 2020 в 20:26

1 ответ

Если коротко, то следующий код должен работать корректно, просто сделайте эту инициализацию после загрузки данных из файла.

NameList.ItemsSource = pokemonData.getPokemonNames();

Если вам нужно лучшее решение, вы можете найти его ниже (когда коллекция покемонов изменила пользовательский интерфейс, он будет обновлен автоматически):

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        DataContext = new PokemonData(setDirectory() + @".\PokemonNames.txt");
    }
}

public class Pokemon
{
    public int ID { get; set; }
    public string Name { get; set; }
}

public class PokemonData
{
    public ObservableCollection<Pokemon> Pokemons { get; set; } = new ObservableCollection<Pokemon>();

    public PokemonData(string path)
    {
        LoadData(path);
    }

    private void LoadData(string path)
    {
        Pokemons.Clear();
        using (StreamReader stream = new StreamReader(path))
        {
            int i = 1;
            while (true)
            {
                string pokemonName = stream.ReadLine();

                if (pokemonName != null)
                    Pokemons.Add(new Pokemon { ID = i, Name = pokemonName.Trim() });
                else break;

                i++;
            }
        }
    }
}

И код XAML:

<ComboBox ItemsSource="{Binding Pokemons}">
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Name}"/>
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>
0
Maksym 1 Апр 2020 в 00:50