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