如何访问列表框的项目

How do I Access Items of a Listbox

我有一个这样完成的列表框

<ListBox x:Name="lbAlbumSelect">
                        <ListBox.ItemTemplate>
                            <DataTemplate>
                            <Button>
                                    <Button.Content>
                                        <StackPanel>
                                        <Image />
                                            <TextBlock TextWrapping="Wrap" 
                                                           Text="{Binding album_name}" />
                                        </StackPanel>
                                    </Button.Content>
                                </Button>
                            </DataTemplate>
                        </ListBox.ItemTemplate>
</ListBox>

我想以编程方式访问每个 Image 并设置其 Source。我试着像这样浏览列表框

foreach (Button btn in lbAlbumSelect.Items)
           {
               StackPanel stack=btn.Content;
               Image image=stack.Children.ElementAt(0) as Image;
               //every ListBoxItem is binded to a clsAlbums object that contains various data, 
               //also the name of the image file, but not the path.
               string pathImg = @"/Assets/Images/" + (btn.DataContext as clsAlbums).album_img; 
               LoadImage(pathImg, image); //function that sets image source to path img
           }

但是在 foreach 子句上给我一个 Invalid Cast Exception

有没有更快更正确的方法呢?

理想情况下,您应该将图像源绑定到控件。添加一个额外的 属性 到你的 class clsAlbums 可以绑定到图像源。

public class clsAlbum
{
    public string album_name { get; set; }
    public string album_img { get; set; }
    public string album_img_src 
    {
        get
        {
             return @"/Assets/Images/" + album_img;
        }
    }
}

现在将这个额外的 属性 album_img_src 绑定到您的 xaml。

    <ListBox x:Name="lbAlbumSelect">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <Button>
                <Button.Content>
                    <StackPanel>
                        <Image Source="{Binding album_img_src}"/>
                        <TextBlock TextWrapping="Wrap" 
                                                    Text="{Binding album_name}" />
                    </StackPanel>
                </Button.Content>
            </Button>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>
  1. 该项实际上是ListBoxItem。在您的情况下,Button 是 ListBoxItem 的内容,Button 的内容是 StackPanel,Image 是 StackPanel 的子项。因此,您需要以某种方式遍历可视化树,例如,您可以使用 Linq to visual tree 来实现。 http://www.codeproject.com/Articles/63157/LINQ-to-Visual-Tree

  2. 访问数据模板中元素的最简单方法可能是从它的加载或初始化事件:

此处:

<Image Loaded="Image_Loaded" />

void Image_Loaded(object sender, EventArgs e){
    var image =(Image)sender;
  1. 尽量避免访问数据模板中的元素。使用 ViewModel、转换器、使用行为、数据触发器或提取数据模板以分离 UserControl
  2. 时,90% 的人可以更好地实现目标