Ссылаясь на управление триггером взаимодействия - PullRequest
0 голосов
/ 15 ноября 2018

Я использую интерфейс 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, по-видимому, не является свойством зависимости, поэтому нельзя назначить ему ресурс.Поэтому мне все еще приходится повторять один и тот же код для каждого элемента управления, которому я хочу назначить эту команду.

1 Ответ

0 голосов
/ 15 ноября 2018

Как насчет:

CommandParameter="{Binding RelativeSource={RelativeSource Self}}"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...