我有一个带有自定义stackpanel的列表框(现在只是一个类扩展了一个stackpanel,但我希望在这里做一些动画)作为其itemspanel。现在,当选择更改时,我想到在最后选择的项目和当前所选项目之间做一些漂亮的动画。
现在我的问题是我如何抓住itemspanel中的所选项目?
这就是我定义itemspanel的方式
<ItemsPanelTemplate>
<l:CustomStackPanel SelectedItem="{Binding SelectedItem,ElementName=listbox}" IsItemsHost="True" Orientation="Vertical"/>
</ItemsPanelTemplate>
我在自定义堆栈面板中创建了一个名为SelectedItem
的dependencypropertypublic UIElement SelectedItem
{
get { return (UIElement)GetValue(SelectedItemProperty); }
set { SetValue(SelectedItemProperty, value); }
}
// Using a DependencyProperty as the backing store for SelectedItem. This enables animation, styling, binding, etc...
public static readonly DependencyProperty SelectedItemProperty =
DependencyProperty.Register("SelectedItem", typeof(UIElement), typeof(CustomStackPanel), new PropertyMetadata(null,selectionChanged));
我想我可以简单地将列表框中的selectedItem绑定到stackpanel中的selecteditem。但这种方法根本行不通。
另一个想法是覆盖stackpanel上的previewmousedown,并从stackpanel的 Children 中找到相应的项目。但我又不知道如何找到该项目。
答案 0 :(得分:1)
在绑定中使用RelativeSource
<ItemsPanelTemplate>
<l:CustomStackPanel SelectedItem="{Binding SelectedItem,RelativeSource={RelativeSource FindAncestor, AncestorType=x:Type ListBox}}" IsItemsHost="True" Orientation="Vertical"/>
</ItemsPanelTemplate>