我正在为ItemsControl创建一个行为,目的是选择我点击的项目(并将其添加到所选项目列表中)。
因此很容易获得所有项目:
hours = AssociatedObject.ItemsSource as List<Hour>;
当然我可以写小时[0] .Selected = true;
然后我有一个鼠标事件,我尝试写这样的东西:
void AssociatedObject_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
hour = sender as Hour;
}
问题是,它没有像我预期的那样工作......发件人不是一个小时,它是一个ItemsControl。
我没有说明点击了哪个小时。 那我该怎么办才能得到这个时刻呢?
修改 我的代码是这样的: 有一个ItemsControl绑定到Days列表。 每天都有一个小时列表。 并且为了表示,有一个内部ItemControl绑定到(day。)小时。 并且代表每个小时,有一个边界。
看起来像这样:
<ItemsControl x:Name="daysPanel" Grid.Column="1" ItemsSource="{Binding Days}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<ItemsControl x:Name="dayHours" ItemsSource="{Binding Hours}" Grid.Row="1">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Border Name="dayHourBorder" Tag="{Binding}" Height="30" BorderBrush="#B0B6BE" Width="193" BorderThickness="1,0,1,1" Background="{Binding Path=Selected, Converter={StaticResource boolToColorConverter}}" >
答案 0 :(得分:8)
感谢大家试图提供帮助,但我找到了正确的方法。 我知道必须有简单的方法来获取被点击的UI元素,只需要一个!
并且有! 而不是与发件人合作,你只需要做: e.OriginalSource
让我获得了边界(以及与之相关的小时)。 所以它就像“简单”一样:
(e.OriginalSource as Border).DataContext as Hour
答案 1 :(得分:1)
VisualTreeHelper可能对您有用。 您可以使用获取点的所有元素,鼠标单击并获取边框。它的标签绑定到小时,所以你可以得到它 来自SO的Get the ItemsControl of a DataTemplate和来自VisualTreeHelper的http://blogs.msdn.com必须为您提供帮助。
答案 2 :(得分:0)
我相信这应该有用 - 发件人将是发送click事件的UI元素,并且由于你正在使用ItemsSource来设置它,所以每个项目的DataContext都将是您所追求的:
hour = (sender as FrameworkElement).DataContext as Hour
答案 3 :(得分:0)
它自己的ItemsControl不提供当前所选项目的任何属性或事件。您必须使用分别来自ListBox的ItemsControl派生的类Selector,因为它包含项目选择的功能(SelectedItem,SelectedIndex属性,...)。
答案 4 :(得分:0)
我必须做一些与你正在做的事情类似的事情。我想让当前行成为选定行。
最简单的方法是使用ICollectionView
MSND link并将THAT绑定到ItemsControl
。
然后,您可以添加一个侦听所选事件的行为(如果它不存在),并相应地更改当前行为。
然后,您只需要在ViewModel上连接CurrentChanged
事件,并且您与UI完全分离:)
请告诉我这是否是您正在关注的内容,我可以尝试将一些代码作为示例。