Я использую интерфейс IController для привязки обработчиков действий для управления свойствами, подобными этому:
<TextBox Name="FirstNameTextBox" Margin="5" Text="{Binding FirstName, UpdateSourceTrigger=Explicit}"
MinWidth="200">
<i:Interaction.Triggers>
<i:EventTrigger EventName="Loaded">
<i:InvokeCommandAction Command="{Binding Path=GetBindingCommand}"
CommandParameter="{Binding ElementName=FirstNameTextBox}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
</TextBox>
Мне нужно передать вызывающий элемент управления обработчику, поэтому я использую
CommandParameter="{Binding ElementName=FirstNameTextBox}"
Это работает нормально и выполняет свою работу, но мне нужно указать каждый элемент управления по имени и повторить практически одинаковый код настройки триггера для каждого элемента управления.Если есть способ обратиться к элементу управления из триггера, я мог бы создать ресурс и поделиться им для каждого элемента управления, но я не нашел его.Так вот в чем вопрос: можно ли как-то ссылаться на элемент управления из триггера без указания имени?
Обновление
Хорошо, я нашел решение для этого,Вы просто определяете свое собственное действие TriggerAction следующим образом:
class SenderAccessTrigger : TriggerAction<DependencyObject>
{
public ICommand Command
{
get { return (ICommand)GetValue(CommandProperty); }
set { SetValue(CommandProperty, value); }
}
public object CommandParameter
{
get { return GetValue(CommandParameterProperty); }
set { SetValue(CommandParameterProperty, value); }
}
protected override void Invoke(object parameter)
{
if(AssociatedObject!=null && Command!=null)
{
Command.Execute(AssociatedObject);
}
}
public static readonly DependencyProperty CommandProperty =
DependencyProperty.Register("Command", typeof(ICommand), typeof(SenderAccessTrigger), new UIPropertyMetadata());
public static readonly DependencyProperty CommandParameterProperty =
DependencyProperty.Register("CommandParameter", typeof(object), typeof(SenderAccessTrigger), new UIPropertyMetadata());
}
Дело в том, что класс TriggerAction имеет свойство AssociatedObject, которое фактически является элементом управления, вызывающим событие.Но это свойство является частным.Таким образом, чтобы получить к нему доступ, я определил свой собственный TriggerAction, который выполняет команду с этим AssociatedObject в качестве параметра.
Теперь в xaml вместо
<i:InvokeCommandAction Command="{Binding Path=GetBindingCommand}"
CommandParameter="{Binding ElementName=FirstNameTextBox}"/>
я могу сделать
<local:SenderAccessTrigger Command="{Binding Path=GetBindingCommand}"/>
и получите вызывающий элемент управления в качестве параметра в команде.
Но есть еще одна проблема.Interaction.Triggers, по-видимому, не является свойством зависимости, поэтому нельзя назначить ему ресурс.Поэтому мне все еще приходится повторять один и тот же код для каждого элемента управления, которому я хочу назначить эту команду.