列表框可以显示字典中的键和值吗

can listbox show both key and value from dictionary

我有一本字典,在 MyClass 中有一个 int 属性 public Dictionary<MyClass, BitmapImage> MyList = new Dictionary<MyClass, BitmapImage>(); 我希望列表框显示此集合中的图像(如 ItemsSource?)并在每个图像附近的文本框中显示每个 属性,这可能吗?

代码隐藏示例:

C#:

public MainWindow()
{
    InitializeComponent();
    PopulatePeople();
}

private void PopulatePeople()
{
   List<Person> persons = new List<Person>();
   for (int i = 0; i < 10; i++)
   {
      persons.Add(new Person() { Name = "Bob " + i.ToString(), ImageAddress = "Images/peach.jpg" });
    }
   listBox.ItemsSource = persons;
 }

XAML:

<ListBox Name="listBox">            
        <ListBox.ItemTemplate>
            <DataTemplate>
                <StackPanel Orientation="Horizontal">
                    <Image Source="{Binding Path=ImageAddress}" Width="50" Height="50"/>
                    <TextBox Text="{Binding Path=Name}" />
                </StackPanel>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>

MVVM 示例:

Download the example from OneDrive.

最好在ListBox中使用DataTemplate来显示ImageTextBox

型号:

public class Person 
{
    public int IDPerson { get; set; }
    public string Name { get; set; }
    public string ImageAddress { get; set; }
}

您可以在 ViewModel 的构造函数中填充您的集合:

ViewModel:

public class YourViewModel:INotifyPropertyChanged 
{
    private ObservableCollection<Person> persons = new ObservableCollection<Person>();
    public ObservableCollection<Person> Persons
    {
       get { return persons; }
       set
       {
          persons = value;
          OnPropertyChanged("Persons");
        }
     }

     public  YourViewModel()
     {  
        FillThePersons();
    }

    private void FillThePersons()
    {           
        for (int i = 0; i < 10; i++)
        {
            persons.Add(new Person() { Name = "Bob " + i.ToString(),      
            ImageAddress="Images/peach.jpg" });// Images is the name folder in your project
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    public void OnPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));

    }
} 

XAML:

<ListBox ItemsSource="{Binding Persons}">            
   <ListBox.ItemTemplate>
      <DataTemplate>
         <StackPanel Orientation="Horizontal">
            <Image Source="{Binding Path=ImageAddress}" Width="50" Height="50"/>
            <TextBox Text="{Binding Path=Name}" />
         </StackPanel>
      </DataTemplate>
  </ListBox.ItemTemplate>
</ListBox>

以下示例一张图片到所有项目:

<ListBox ItemsSource="{Binding Persons}">
   <ListBox.Resources>
      <BitmapImage x:Key="AnImage" UriSource="Images/yourImage.png" />
   </ListBox.Resources>
   <ListBox.ItemTemplate>
      <DataTemplate>
         <StackPanel Orientation="Horizontal">
            <Image Source="{StaticResource AnImage}" Width="50" Height="50"/>
            <TextBox Text="{Binding Path=Name}" />
         </StackPanel>
       </DataTemplate>
   </ListBox.ItemTemplate>
</ListBox>

结果: