2017-04-04 83 views
1

我试图在用户看到一个视图(BiometricVM)时看到触发器。有问题的视图在另一个视图(ParentView.xaml)中实例化并隐藏。我在这里阅读了几个答案,但他们都没有工作。下面是相关代码:UserControl EventTrigger when visible

ParentView.xaml

<Border BorderBrush="Black" BorderThickness="1" Background="#80000000" Visibility="{Binding BiometricViewVisible, Converter={StaticResource BooleanToVisibilityConverter}}" Grid.RowSpan="2" > 
    <Grid> 
     <WrapPanel HorizontalAlignment="Center" VerticalAlignment="Center" > 
      <Border Style="{StaticResource DefaultWindowBorder}" > 
       <Grid Background="White" > 
        <vw:BiometricView DataContext="{Binding BiometricVM}" Visibility="{Binding BiometricViewVisible, Converter={StaticResource BooleanToVisibilityConverter}}"/> 
       </Grid> 
      </Border> 
     </WrapPanel> 
    </Grid> 
</Border> 

ParentViewModel.cs

public bool BiometricViewVisible 
    { 
     get 
     { 
      return _biometricViewVisible; 
     } 
     set 
     { 
      _biometricViewVisible = value; 
      OnPropertyChanged(nameof(BiometricViewVisible)); 
     } 
    } 

BiometricView.xaml

<i:Interaction.Triggers> 
    <i:EventTrigger EventName="IsVisibleChanged"> 
     <i:InvokeCommandAction Command="{Binding Path=OnLoadedCommand}"/> 
    </i:EventTrigger> 
</i:Interaction.Triggers> 

这是没有得到所谓的命令( OnLoadedCommand)。

在这个问题上的任何帮助,将不胜感激。

+2

这个问题似乎是'IsVisibleChanged'是DependendyPropertyChanged事件,而不是一个'RoutedEvent'和'我:EventTrigger'只有路由事件的作品。例如'MouseDown'是一个'RoutedEvent':如果将'EventName'改为'MouseDown',那么当控件可见时,点击它应该调用'OnLoadedCommand'。这并不能帮助你。您可以使用常规事件处理程序撤退并执行此操作,也可以编写自己的行为,以便在依赖项属性更改事件上执行命令。 –

+0

@EdPlunkett只有在视图对用户可见时才能调用BiometricViewModel.cs类的最佳方法是什么? –

+0

如果它是您的类,请使用DependencyPropertyDescriptor.FromProperty获取其Visibility属性的dpd并调用AddValueChanged以添加处理程序。这是最快的。如果你愿意,你可以将其推广为一种行为。 –

回答

0

为什么不能只需在BiometricViewVisible源setter方法调用命令?

public bool BiometricViewVisible 
{ 
    get 
    { 
     return _biometricViewVisible; 
    } 
    set 
    { 
     _biometricViewVisible = value; 
     OnPropertyChanged(nameof(BiometricViewVisible)); 
     if (value) 
     { 
      OnLoadedCommand.Execute(null); 
     } 
    } 
} 

由于BiometricViewVisibility属性直接绑定到该源属性,显示将变为可见,只有当此属性设置为true,无论如何,这样你就不需要处理任何事件。