Silverlight ItemsControl行为:我如何获得我点击的项目?

时间:2011-02-17 05:45:02

标签: c# silverlight itemscontrol behavior

我正在为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}}" >

5 个答案:

答案 0 :(得分:8)

感谢大家试图提供帮助,但我找到了正确的方法。 我知道必须有简单的方法来获取被点击的UI元素,只需要一个!

并且有! 而不是与发件人合作,你只需要做: e.OriginalSource

让我获得了边界(以及与之相关的小时)。 所以它就像“简单”一样:

(e.OriginalSource as Border).DataContext as Hour

答案 1 :(得分:1)

VisualTreeHelper可能对您有用。 您可以使用获取点的所有元素,鼠标单击并获取边框。它的标签绑定到小时,所以你可以得到它 来自SO的Get the ItemsControl of a DataTemplate和来自VisualTreeHelperhttp://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完全分离:)

请告诉我这是否是您正在关注的内容,我可以尝试将一些代码作为示例。