我有一个ListBox
我为其项目定义了DataTemplate
:
<ListBox.ItemTemplate>
<DataTemplate>
<Border>
<TextBlock Text="{Binding Name}" />
</Border>
</DataTemplate>
</ListBox.ItemTemplate>
我用来向ListBox
添加元素的类如下:
public class MyItem
{
public string Name
{ get; set; }
}
现在我需要更改ListBox
项目的背景,例如选择项目时:
private void ListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (e.AddedItems.Count == 1)
{
var item = e.AddedItems.First() as MyItem;
}
}
问题是该项目的类型为MyItem
,而我也需要访问Border
和TextBlock
个对象。
答案 0 :(得分:1)
您可以对RelativeSource
样式使用精美的Border
绑定:
<Border.Style>
<Style TargetType="Border">
<Style.Triggers>
<DataTrigger Binding="{Binding IsSelected, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ListBoxItem}}" Value="True">
<Setter Property="Background" Value="Pink"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Border.Style>
这将创建一个DataTrigger
,它将绑定到父IsSelected
的{{1}}属性,当它被选中时,它将设置ListBoxItem
的背景颜色到Border
。
答案 1 :(得分:0)
问题是该项是MyItem类型,而我也需要访问Border和TextBlock对象。
如果您只想在选择项目时更改背景,可以参考评论中的答案和@Mike Eason的答案。
但我认为您的主要目的是使用Border
事件SelectionChanged
来获取所选项目中的ListBox
控件。正如@ S.Akbari所提供的,您可以使用VisualTreeHelper
来查找边框,但您可以使用其他更简单的方法。
private void ListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
var listBox = sender as ListBox;
var container = listBox.ContainerFromItem(listBox.SelectedItem) as ListBoxItem;
var border = container.ContentTemplateRoot as Border;
border.Background = new SolidColorBrush(Colors.Pink);
}
使用ItemsControl.ContainerFromItem method可以帮助您找到与指定项目对应的容器,然后由于Border
是DataTemplate
中的根控件,我们可以使用ContentControl.ContentTemplateRoot property获取ContentTemplate
属性指定的数据模板的根元素。