涉及交互触发控制

时间:2018-11-15 19:54:00

标签: c# wpf mvvm data-binding

我正在使用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作为参数执行Command。

现在使用xaml代替

<i:InvokeCommandAction Command="{Binding Path=GetBindingCommand}"
                        CommandParameter="{Binding ElementName=FirstNameTextBox}"/>

我能做

<local:SenderAccessTrigger Command="{Binding Path=GetBindingCommand}"/>

并在命令中获取一个令人兴奋的控件作为参数。

但是还有另一个问题。 Interaction.Triggers似乎不是依赖项属性,因此无法为其分配资源。因此,对于要分配给该命令的每个控件,我仍然必须重复相同的代码。

1 个答案:

答案 0 :(得分:0)

怎么样:

>>> replace_rest(my_string, "Y")
'Person X did something. Y found it to be good, and so Y went home.'