项目需求,ListBox选中切换其选中项的Image控件的图片,其它每项ListBoxItem的相应Image控件都设置为未选中图片.
解决方案适用于ComboBox等:
1.先看xaml文件:
<DataTemplate x:Name="BusTemplate" x:Key="LBDataTemplate">
<StackPanel>
<StackPanel Orientation="Horizontal" Margin="10">
<TextBlock Text="{Binding BusStr}" VerticalAlignment="Center" FontSize="30" Foreground="White" Width="360"/>
<Image x:Name="BusStausImage" Source="/Image/d1.png"/>
</StackPanel>
</StackPanel>
</DataTemplate>
<ListBox ItemsSource="{Binding}" x:Name="BusList" SelectionChanged="ListBox_SelectionChanged" ItemTemplate="{StaticResource LBDataTemplate}">
2.现在要获取上面LisxBox的所有动态绑定项中的控件集合,然后全部换成默认图片。然后把当前选择项的Image换成选中样式的图片
<Image x:Name="BusStausImage" Source="/Image/1.png"/>
3.注册ListBox的SelectionChanged事件
private void ListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
//通过函数FindFirstVisualChild遍历LisxBox获取Image集合
List<Image> imgList = FindFirstVisualChild<Image>(BusList, "BusStausImage");
foreach (Image img in imgList)
img.Source = new BitmapImage(new Uri("/Image/车辆/d1.png", UriKind.Relative));
//获取当前选中项的Image,FindFirstVisualChild2获取单个
ListBoxItem myListBoxItem = (ListBoxItem)BusList.ItemContainerGenerator.ContainerFromItem(BusList.SelectedItem);
Image image = FindFirstVisualChild2<Image>(myListBoxItem, "BusStausImage");
image.Source = new BitmapImage(new Uri("/Image/d2.png", UriKind.Relative));
catch (Exception)
自定义方法1:FindFirstVisualChild:
//遍历指定容器,根据控件名,返回适配的控件集合
public List<T> FindFirstVisualChild<T>(DependencyObject obj, string childName) where T : DependencyObject
List<T> childList = new List<T>();
//遍历指定容器
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)
DependencyObject child = VisualTreeHelper.GetChild(obj, i);
if (child != null && child is T && child.GetValue(NameProperty).ToString() == childName)
childList.Add((T)child);
//如果不存在,则继续遍历指定容器的子容器(则如果指定容器的子容器也就是第二层,遍历存在匹配的控件则跳出。不再遍历其第三层,继续遍历第二层)
List<T> t2 = FindFirstVisualChild<T>(child, childName);
if (t2 != null && t2.Count > 0)
foreach (T t in t2)
childList.Add(t);
return childList;
自定义方法2:FindFirstVisualChild2
//遍历容器,根据控件名,返回第一个适配的控件
public T FindFirstVisualChild2<T>(DependencyObject obj, string childName) where T : DependencyObject
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)
DependencyObject child = VisualTreeHelper.GetChild(obj, i);
if (child != null && child is T && child.GetValue(NameProperty).ToString() == childName)
return (T)child;
T childOfChild = FindFirstVisualChild2<T>(child, childName);
if (childOfChild != null)
return childOfChild;
return null;
自定义方法3:
//遍历指定容器的所有子控件(包括子控件的子控件),根据指定控件名称,返回控件集合。如果传“”则返回所有子空间的集合
public List<T> GetChildObjects<T>(DependencyObject obj, string name) where T : FrameworkElement
DependencyObject child = null;
List<T> childList = new List<T>();
for (int i = 0; i <= VisualTreeHelper.GetChildrenCount(obj) - 1; i++)
child = VisualTreeHelper.GetChild(obj, i);
if (child is T && (((T)child).Name == name || string.IsNullOrEmpty(name)))
childList.Add((T)child);
childList.AddRange(GetChildObjects<T>(child, ""));//指定集合的元素添加到List队尾
return childList;
http://social.msdn.microsoft.com/Forums/vstudio/en-US/a01eb1d5-cfc1-47fc-a8e5-45f7f02e8119/wpf-finding-control-inside-itemtemplates-datatemplate?forum=wpf
http://blog.csdn.net/wushang923/article/details/6742378
项目需求,ListBox选中切换其选中项的Image控件的图片,其它每项ListBoxItem的相应Image控件都设置为未选中图片.解决方案适用于ComboBox等:1.先看xaml文件:<DataTemplate x:Name="BusTemplate" x:Key="LBDataTemplate"> <StackPanel> <StackPanel Orientation="Horizontal" Margin="10">
虽然DataTemplate 是用来绑定的,一般用ONE TWOWAY 来绑定传递或获取数据.
但是今天这个需求真是没办法,在绑定的模板内添加了一个非绑定的数据,需要手动取值.
解决方案原理:
https://msdn.microsoft.com/zh-cn/library/bb613579.aspx
foreach (var item in F
做项目时找到的方法,引用自http://bbs.csdn.net/topics/390890082,觉得挺好的,保存下来
获取在ListBox中的DataTemplate下的每一个button对象的方法如下:
private T SearchVisualTree<T>(DependencyObject tarElem) where T : DependencyObject
if (tarElem != null)
http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/a01eb1d5-cfc1-47fc-a8e5-45f7f02e8119】
How do I programmatically find a control inside an itemtemplates datatemplate, e.g. how do I fin
ListboxItemContainer样式
一般items控件的项模板 很容易 设置DataTemplate就可以了,比如listbox 。但是在选中和失去焦点的时候 却是Windows自带的那种 蓝色下拉框选中效果 ,为了更改这种效果,首先尝试定义控件的itemcontainerstyle:
3 <Setter Property="ItemContainerSt...
在WPF中我们可以为自己的数据定制显示方式,虽然数据是一定的,但是DataTemplate模板可以做到让它的表现形式多种多样,这意味着要重写它原来的模板结构。与控件模板不同的是两者应用的不同,DataTemplate模板更多用于Content Control类控件与Items Control类控件。
在ListBox的Item中显示某个成员的姓名、年龄之类的基本信息,点击左边的Name,右边显示...
1.已知item的DataContext,获取ListBoxItem
1)ItemContainerGenerator.ContainerFromItem
var selectedItem = DocumentsControl.ItemContainerGenerator.ContainerFromItem(object itemModel)
注:如果开...
今天给ListBox中通过DataTemplate生成的Button绑定命令时,一开始Button始终找不到绑定的命令。现找到了正确的绑定方式,特来记录一下。
先上个正确的示例:
<ListBox Grid.Column="0" ItemsSource="{Binding CallBussiness}">
<ListBox.ItemsPane...
下面我来自定义类似系统ListBox的MyListBox控件,里面包含模版属性ItemTeamplate。
1、添加新类MyListBox.cs,让它继承自Grid:
[TemplatePart(Name = "ItemTemplate", Type = typeof(UIElement))]
public class MyListBox : Grid
2、添加ItemTemplate模
要获取 ListBox 控件中所选的项,可以使用 ListBox 控件的 SelectedItems 属性,它返回一个 SelectedObjectCollection 对象,其中包含所有当前选定的项。
以下是使用 SelectedItems 属性获取 ListBox 所选项的示例代码:
```csharp
// 获取 ListBox 控件中选中的项
var selectedItems = listBox1.SelectedItems;
// 遍历选中的项并输出它们的文本
foreach (var selectedItem in selectedItems)
string itemText = selectedItem.ToString();
Console.WriteLine(itemText);
在上面的示例中,假设 `listBox1` 是您要获取选中项的 ListBox 控件。`listBox1.SelectedItems` 返回一个 SelectedObjectCollection 集合,其中包含所有当前选定的项。在 foreach 循环中,我们遍历选中的项并输出它们的文本。