我正在使用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似乎不是依赖项属性,因此无法为其分配资源。因此,对于要分配给该命令的每个控件,我仍然必须重复相同的代码。
答案 0 :(得分:0)
怎么样:
>>> replace_rest(my_string, "Y")
'Person X did something. Y found it to be good, and so Y went home.'