我想弄清楚的是两件事,如何在用户控件的可见性发生变化时触发,并将可见性值作为参数传递。
无论出于何种原因,触发器似乎都没有被触发。我刚刚在ControlVisible参数中添加了以显示我想要发生的事情,当测试它不存在时,只有一个消息框可以捕获可见性发生变化时,如注释掉的方法。
我在Visual Studio 2010中使用4.0
包含用户控件的主窗口视图
<Window x:Class="bt.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:vm="clr-namespace:bt"
xmlns:ctrls="clr-namespace:bt.Controls"
xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
xmlns:ei="clr-namespace:Microsoft.Expression.Interactivity.Core;assembly=Microsoft.Expression.Interactions"
mc:Ignorable="d">
<Grid>
<ctrls:Login Visibility="{Binding DataContext.Vis,RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window},Converter={StaticResource BooleanToVisibilityConverter}}" >
<i:Interaction.Triggers>
<i:EventTrigger EventName="IsVisibleChanged">
<ei:CallMethodAction MethodName="VisibleTrigger" />
</i:EventTrigger>
</i:Interaction.Triggers>
</ctrls:Login>
</Grid>
</Window>
UserControl视图模型:
namespace bt.Controls
{
class LoginViewModel
{
public LoginViewModel()
{
}
public void VisibleTrigger(bool ControlVisible)
{
if (ControlVisible)
{
MessageBox.Show("Start timer");
}
else
{
MessageBox.Show("Stop timer");
}
}
//public void VisibleTrigger()
//{
// MessageBox.Show("Changed");
//}
}
}
答案 0 :(得分:4)
首先,我们需要将TargetObject属性设置为viewmodel / DataContext,因为viewmodel中提供了要调用的方法:
......
<i:Interaction.Triggers>
<i:EventTrigger EventName="IsVisibleChanged">
<ei:CallMethodAction MethodName="VisibleTrigger" TargetObject="{Binding}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
......
其次,EventTrigger似乎不适用于IsVisibleChanged事件。因此,上面的代码段适用于其他事件,但不适用于IsVisibleChanged。我们可以在this SO question的答案中找到解决方法,方法是使用PropertyChangedTrigger侦听Visibility属性已更改,而不是侦听IsVisibleChanged事件:
<i:Interaction.Triggers>
<ei:PropertyChangedTrigger Binding="{Binding Visibility, ElementName=MyControlName}">
<ei:CallMethodAction MethodName="VisibleTrigger" TargetObject="{Binding}"/>
</ei:PropertyChangedTrigger>
</i:Interaction.Triggers>
第三,CallMethodAction似乎没有提供将参数传递给方法的方法。为了能够使用参数调用方法,我们最好使用InvokeCommandAction而不是建议here的CallMethodAction,并在@Rohit中由previous question建议。