@iRumba

Как в ItemsControl выполнить метод класса источника при возникновении события (например щелчка мышью)?

Здравствуйте. Я не знаю, что именно может понадобиться тем, кто попытается мне помочь, поэтому код не выкладываю, чтобы не сбивать никого с толку. Опишу суть проблемы на яблоках.
Есть класс
поле1
поле2
***
Метод1(параметр)

Есть так же форма, на которой расположен ItemsControl, отображающий коллекцию (лист) экземпляров этого класса и включает DataTemplate для экземпляров. Это Border, внутри которого TextBlock, отображающий, например, поле1.ToString(). А мне еще надо, чтобы по нажатию левой кнопки мыши выполнялся Метод1(с параметром). При добавлении события PreviewMouseLeftButtonDown на сам ItemsControl я получаю в качестве sender коллекцию экземпляров, а при добавлении события на Border, получаю Border :)
А мне надо при клике на элементе получить экземпляр класса, на основании которого он был отрисован, чтобы выполнить Экземпляр.Метод1(с параметром). Ну параметр из XAML я и не надеюсь передать (но хотелось бы), но сам то экземпляр получить должен быть способ. Как? Спасибо.

Ну можно конечно в Border указать Tag="{Binding}", но не хотелось бы. Таг я всегда оставляю для временных костылей, так что занимать его не стоит.
  • Вопрос задан
  • 170 просмотров
Решения вопроса 1
Nipheris
@Nipheris Куратор тега C#
Я так понимаю, раз Метод1 у вас во viewmodel, то в нем бизнес-логика (а не логика представления). Если так, то советую провернуть это все через Command:
1) в родительской viewmodel (та, которая список) делаете команду с одним параметром (в примере: DoStrangeThingCommand);
2) с помощью EventTrigger делаете так, чтобы по событию нажатия л.к.м. на текстблоке дергалась эта команда;
3) в качестве параметра команды передаем текущую привязку (т.е. выбранный элемент в списке);
4) в команде собственно дергаем Метод1
5) профит

<DataTemplate ... >
	<TextBlock>
		<i:Interaction.Triggers>
			<i:EventTrigger EventName="MouseLeftButtonDown">
				<i:InvokeCommandAction
					Command="{Binding RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}},
						Path=DataContext.DoStrangeThingCommand}"
					CommandParameter="{Binding}" />
			</i:EventTrigger>
		</i:Interaction.Triggers>
	</TextBlock>
</DataTemplate>
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы