gpt4 book ai didi

c# - UWP 等同于 uwp 中 FindAncestor 的函数

转载 作者:可可西里 更新时间:2023-11-01 09:05:04 24 4
gpt4 key购买 nike

我有一个订单列表,当订单状态为已取消时,我想使文本闪烁。到目前为止,我的代码有效。然而,有时它会抛出异常:

WinRT information: Cannot resolve TargetName lblOrderStatus

由于某种原因可以找到lblOrderStatus。所以,我想使用“FindAncestor”,但 UWP 中不存在 FindAncestor。 uwp 中是否有与 FindAncestor 等效的函数?

这是我的代码:

<ItemsControl x:Name="Orders" Grid.Row="1" Background="Transparent">
...
...
...
<ItemsControl.ItemTemplate>
<DataTemplate>
<Grid>
...
...
...
<Viewbox Grid.Column="3" StretchDirection="DownOnly" HorizontalAlignment="Right">
<TextBlock x:Name="lblOrderStatus" Text="{Binding Path=OrderItemStatus, Mode=OneWay}" FontSize="18">
<TextBlock.Resources>
<Storyboard x:Name="sbBlinking">
<DoubleAnimation Storyboard.TargetProperty="(FrameworkElement.Opacity)"
Storyboard.TargetName="lblOrderStatus"
From="1" To="0" AutoReverse="True" Duration="0:0:0.5" RepeatBehavior="Forever" />
</Storyboard>
</TextBlock.Resources>
<interactive:Interaction.Behaviors>
<core:DataTriggerBehavior Binding="{Binding OrderItemStatus, Converter={StaticResource EnumToStringConverter}}" ComparisonCondition="Equal" Value="Cancelled">
<media:ControlStoryboardAction Storyboard="{StaticResource sbBlinking}" />
</core:DataTriggerBehavior>
</interactive:Interaction.Behaviors>
</TextBlock>
</Viewbox>
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>

最佳答案

考虑到我见过的所有解决方案,我觉得使用 ElementName 绑定(bind)是 UWP 最简单的解决方法,没有 RelativeSource AncestorType 绑定(bind)选项。

假设您有一个 Page,其 DataContext 设置为带有命令 MyCommand 的 View 模型,并且您希望您的每个项目单击其按钮时执行它的列表:

<Page Name="thisPage">
...
<ListView ...>
<ListView.ItemTemplate>
<DataTemplate>
<Button Command="{Binding ElementName=thisPage, Path=DataContext.MyCommand}" />
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</Page>

这个解决方案的最初问题是您无法将 DataTemplate 作为资源提取出来以在多个屏幕(甚至对话框)上使用它; thisPage 可能并不存在于所有这些地方,或者将根元素命名为“thisPage”可能不合适。

但是,如果您使用一种约定,在使用该 DataTemplate 的每个屏幕中包含一个 token UI 元素,并通过一致的名称引用它,它就会起作用。默认情况下,此元素的 DataContext 将是您的 ViewModel(假设您的根元素也是)

<Rectangle Name="VmDcHelper" Visibility="Collapsed"/> 

...然后在您的独立资源 XAML 文件中,您可以像这样编写您的 DataTemplate:

<DataTemplate x:Key="MyDataTemplate">
<Button Command="{Binding ElementName=VmDcHelper, Path=DataContext.MyCommand}" />
</DataTemplate>

然后,在您使用该模板资源的每个页面/屏幕/对话框上,只需放入该矩形(或其他)的副本,一切都会在运行时正确绑定(bind)

这显然是一个 hack 解决方案,但在进一步考虑之后,它并不比首先使用 WPF 的 AncestorType 更像是一个 hack(必须确保您的祖先类型始终保持一致)您使用 DataTemplate 的地方)。

关于c# - UWP 等同于 uwp 中 FindAncestor 的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37972934/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com