Мой массив — это список имен покемонов, считанный из текстового файла, а затем сохраненный в массиве в классе 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, в частности, массивом, содержащим все имена. Проблема в том, что всякий раз, когда я связываю данные или устанавливаю данные, они никогда не отображаются в графическом интерфейсе или в поле со списком.
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>
Похожие вопросы
Новые вопросы
c#
C# (произносится как «see Sharp») — это высокоуровневый мультипарадигменный язык программирования со статической типизацией, разработанный Microsoft. Код C# обычно нацелен на семейство инструментов и сред выполнения Microsoft .NET, которое включает в себя .NET, .NET Framework, .NET MAUI и Xamarin среди прочих. Используйте этот тег для ответов на вопросы о коде, написанном на C#, или о формальной спецификации C#.
getPokemonNames()
(действительно ли этоpopulateArray()
?), и в вашем комментарии говорится, чтоpokemonNames
- это словарь, хотя ваш предыдущий код показывает, что это массив. ОднакоsetDirectory() + @".\PokemonNames.txt"
будет проблематичным, потому что вы добавляете.
ко всему, что возвращаетsetDirectory()
. Это должно быть простоsetDirectory() + @"\PokemonNames.txt"
или, еще лучше,Path.Combine(setDirectory(), "PokemonNames.txt")
.ComboBox
? Две строки, которые устанавливаютNameList.ItemsSource
, где они расположены и что их вызывает? Где используется этот классPokemonData
? Вам может потребоваться показать соответствующий XAML и код программной частиWindow
, содержащийComboBox
.