【问题标题】:UserControl EventTrigger when Visible可见时的用户控件事件触发器
【发布时间】:2017-04-04 19:09:01
【问题描述】:

我正在尝试在视图(BiometricVM)对用户可见时触发。有问题的视图在另一个视图 (ParentView.xaml) 中实例化并隐藏。我在这里阅读了几个答案,但没有一个有效。以下是相关代码:

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)。

我们将非常感谢您对此事的任何帮助。

【问题讨论】:

  • 问题似乎是IsVisibleChanged 是一个DependendyPropertyChanged 事件,而不是RoutedEvent,并且i:EventTrigger 仅适用于路由事件。例如MouseDownRoutedEvent:如果您将EventName 更改为“MouseDown”,那么当控件可见时,单击它应该调用OnLoadedCommand。并不是说这对你有帮助。您可以撤退并使用常规事件处理程序来执行此操作,或者您可以编写自己的行为来执行依赖属性更改事件的命令。
  • @EdPlunkett 只有当视图对用户可见时才能调用 BiometricViewModel.cs 类的最佳方法是什么?
  • 如果是您的类,请使用 DependencyPropertyDescriptor.FromProperty 获取 dpd 的 Visibility 属性并调用 AddValueChanged 添加处理程序。那是最快的。如果您愿意,您可以将其概括为一种行为。
  • 如果您能解释一下会有所帮助:a)您需要对可见性更改为可见做些什么,b)为什么您不能只响应视图模型可见性属性的更改, c) 为什么你不能处理Loaded 事件(它 RoutedEvent)。如前所述,您的问题非常广泛,因为有许多不同的方法可以解决所描述的行为。

标签: c# wpf xaml data-binding


【解决方案1】:

为什么不能简单地调用 BiometricViewVisible 源属性的 setter 中的命令?

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

由于BiometricViewVisibility 属性直接绑定到此源属性,因此仅当此属性设置为true 时视图才会可见,因此您无需处理任何事件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-21
    • 1970-01-01
    • 1970-01-01
    • 2019-06-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多