Поведение Silverlight ItemsControl: как получить элемент, на который я нажимаю? - PullRequest
4 голосов
/ 17 февраля 2011

Я создаю поведение для ItemsControl с целью выбора элемента, на который я нажимаю (и добавления его в список выбранных элементов).

Таким образом, легко получить все элементы:

hours = AssociatedObject.ItemsSource as List<Hour>;

и, конечно, я могу написать часы [0] .Selected = true;

, но потом у меня есть событие мыши, что я попытался написать что-то вроде этого:

void AssociatedObject_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        hour = sender as Hour;
    }

проблема в том, что он не работает так, как я ожидал ... отправитель - это не час, это ItemsControl.

и у меня нет никаких указаний относительно того, какой час был нажат.так что я должен сделать, чтобы получить час?

Редактировать Мой код работает следующим образом: элемент ItemsControl привязан к списку дней.у каждого дня есть список часов.и для представления этого существует внутренний ItemControl, связанный с (дн.) часами.и для представления каждого часа есть граница.

выглядит следующим образом:

 <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 ]

8 голосов
/ 18 февраля 2011

спасибо всем за попытку помочь, но я нашел правильный способ сделать это.я знал, что должен быть простой способ получить элемент пользовательского интерфейса, по которому щелкнули, просто должен был быть один!

и это было!вместо того, чтобы работать с отправителем, вы просто должны сделать: e.OriginalSource

, который дал мне границу (и час, который ей ограничен).так что это так же просто, как:

(e.OriginalSource as Border).DataContext as Hour
1 голос
/ 18 февраля 2011

VisualTreeHelper может быть полезно для вас. Вы можете использовать, чтобы получить все элементы в точке, где щелкнули мышью и получить вашу границу. Его тег привязан к часам, поэтому вы можете его получить.
Получите ItemsControl DataTemplate от SO и VisualTreeHelper от http://blogs.msdn.com должен вам помочь.

0 голосов
/ 17 февраля 2011

ItemsControl сам по себе не предоставляет никаких свойств или событий для выбранного в данный момент элемента.Вы должны использовать класс, такой как ListBox , который получен из ItemsControl, соответственно из Selector , потому что он содержит функциональные возможности для выбора элемента (свойство SelectedItem, SelectedIndex, ...).

0 голосов
/ 17 февраля 2011

Я должен был сделать что-то похожее на то, что вы делаете. Я хотел сделать текущую строку выбранной.

Самый простой способ - использовать ICollectionView MSND-ссылку и привязать ТО к ItemsControl. Затем вы можете добавить поведение (если оно еще не существует), которое прослушивает выбранное событие и соответственно изменяет текущее.

Тогда вам нужно только подключить событие CurrentChanged к вашей ViewModel, и вы полностью отделены от пользовательского интерфейса:)

Дайте мне знать, если это то, что вы ищете, и я могу попытаться получить часть моего кода в качестве примера.

0 голосов
/ 17 февраля 2011

Я считаю, что это должно сработать - отправителем будет элемент пользовательского интерфейса, который отправил событие click, и, поскольку вы используете ItemsSource для его настройки, DataContext каждого элемента будет тем, что вы ищете:

hour = (sender as FrameworkElement).DataContext as Hour
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...