如何访问列表框的项目
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>
该项实际上是ListBoxItem。在您的情况下,Button 是 ListBoxItem 的内容,Button 的内容是 StackPanel,Image 是 StackPanel 的子项。因此,您需要以某种方式遍历可视化树,例如,您可以使用 Linq to visual tree 来实现。 http://www.codeproject.com/Articles/63157/LINQ-to-Visual-Tree
访问数据模板中元素的最简单方法可能是从它的加载或初始化事件:
此处:
<Image Loaded="Image_Loaded" />
void Image_Loaded(object sender, EventArgs e){
var image =(Image)sender;
- 尽量避免访问数据模板中的元素。使用 ViewModel、转换器、使用行为、数据触发器或提取数据模板以分离 UserControl
时,90% 的人可以更好地实现目标
我有一个这样完成的列表框
<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>
该项实际上是ListBoxItem。在您的情况下,Button 是 ListBoxItem 的内容,Button 的内容是 StackPanel,Image 是 StackPanel 的子项。因此,您需要以某种方式遍历可视化树,例如,您可以使用 Linq to visual tree 来实现。 http://www.codeproject.com/Articles/63157/LINQ-to-Visual-Tree
访问数据模板中元素的最简单方法可能是从它的加载或初始化事件:
此处:
<Image Loaded="Image_Loaded" />
void Image_Loaded(object sender, EventArgs e){
var image =(Image)sender;
- 尽量避免访问数据模板中的元素。使用 ViewModel、转换器、使用行为、数据触发器或提取数据模板以分离 UserControl 时,90% 的人可以更好地实现目标