我不相信你能在没有代码的情况下完成这个任务…但是,您不需要使用codebehind。一个“行为”就可以解决这个问题(无论是老派
attached behavior
或者更现代的
Blend Behavior
)下面是使用附加行为修改后的标记的外观:
<Grid>
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition />
</Grid.RowDefinitions>
<ItemsControl x:Name="Buttons" Grid.Row="0" ext:Hover.TrackChildItems="true">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Button Content="{Binding Title}"
Command="{Binding Command}" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
<TextBlock x:Name="TitleTextBox"
Grid.Row="1"
Text="{Binding ElementName=Buttons, Path=ext:Hover.Item.Content}" />
</Grid>
这里,附加的行为“hover.trackchilditems”用于监视适当的鼠标事件,并将只读的“hover.item”附加属性设置为要悬停的控件。写下行为应该足够简单,并且留给你。
编辑
:要为项设置事件处理程序,首先要做的是简单而明显的:迭代项属性中的项并添加处理程序。
Mouse.AddMouseEnter(item, OnMouseEnter);
对于静态内容来说,这很好,但是动态(在运行时添加和删除)内容将被忽略。因此,接下来必须跟踪对items属性的更改。
((INotifyCollectionChanged)Items).CollectionChanged += OnItemsChanged;
在CollectionChanged处理程序中添加和删除项时,根据需要添加或删除鼠标事件处理程序。
还有另一个解决方案。为此创建从itemscontrol派生的新hovertrackingitemscontrol。在此控件中,重写getContainerForItemOverride方法以返回新的hoverTrackingItem,该项处理mouseEnter/mouseLeave以通知父级hoverTrackingitemsControl。此解决方案可能更容易实现,尽管它确实需要专门的控件,而行为解决方案更通用,可以与任何itemscontrol类型(itemscontrol、listbox、comboBox等)一起使用。