2017-04-04 11 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'が' RoutedEvent'ではなくDependendyPropertyChangedイベントであり、 'i:EventTrigger'がルーティングイベントでのみ機能するように見えます。例えば ​​'MouseDown'は' RoutedEvent'です: 'EventName'を" MouseDown "に変更すると、コントロールが表示されているときにそのボタンをクリックすると' OnLoadedCommand'が呼び出されます。それはあなたをここで助けるものではありません。通常のイベントハンドラを使用して後退して実行するか、依存関係プロパティの変更イベントでコマンドを実行する独自の動作を記述することができます。 –

+0

@EdPlunkett BiometricViewModel.csクラスへの呼び出しを取得する最良の方法は、ビューがユーザーに見えるときだけです。 –

+0

クラスの場合は、DependencyPropertyDescriptor.FromPropertyを使用してVisibilityプロパティのdpdを取得し、AddValueChangedを呼び出してハンドラを追加します。それは最速です。あなたが望むなら、それを行動として一般化することができます。 –

答えて

0

BiometricViewVisibleソースプロパティの設定ツールでこのコマンドを呼び出すことはできません。

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

BiometricViewVisibilityプロパティは、直接このソースプロパティにバインドされているので、ビューでは、すべてのイベントを処理する必要はありませんので、このプロパティがとにかくtrueに設定されている場合にのみ表示されるようになります。