UWP中绑定ListView SelectedItem的IsNullOrEmptyStateTrigger失效如何解决
问题原因
你遇到的问题根源有两点:
- 旧版CommunityToolkit中
IsNullOrEmptyStateTrigger的初始值触发逻辑存在局限:当绑定的SelectedItem初始值就是null时,触发器不会主动触发状态激活,导致页面加载后始终停留在默认的ListSomethingSelectedState状态。 - 仅给无选中状态配置了触发器,有选中状态未配置任何触发规则,VisualStateManager无法可靠完成状态切换的判定。
解决方法
你可以任选以下两种方案之一修改代码:
方案一:补充反向触发器,明确两个状态的触发规则
给ListSomethingSelectedState添加CompareStateTrigger,判断SelectedItem不为null时激活该状态,完整的VisualStateGroup代码如下:
<VisualStateGroup x:Name="ListViewStates"> <VisualState x:Name="ListSomethingSelectedState"> <VisualState.StateTriggers> <triggers:CompareStateTrigger Value="{Binding SelectedItem, ElementName=myListView, Mode=OneWay}" CompareTo="{x:Null}" Operator="NotEqual" /> </VisualState.StateTriggers> </VisualState> <VisualState x:Name="ListNothingSelectedState"> <VisualState.StateTriggers> <triggers:IsNullOrEmptyStateTrigger Value="{Binding SelectedItem, ElementName=myListView, Mode=OneWay}"/> </VisualState.StateTriggers> <VisualState.Setters> <Setter Target="myButton.IsEnabled" Value="False" /> </VisualState.Setters> </VisualState> </VisualStateGroup>
方案二:改用x:Bind绑定+调整VisualStateManager位置
如果不想新增反向触发器,可以将绑定改为编译时绑定x:Bind,同时将VisualStateManager.VisualStateGroups从StackPanel内移动到Page标签的属性元素下,确保状态触发的作用域正确:
<Page x:Class="UwpTriggerDemo.MainPage" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="using:UwpTriggerDemo" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:triggers="using:Microsoft.Toolkit.Uwp.UI.Triggers" mc:Ignorable="d" Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"> <!-- 将VisualStateManager移到Page下 --> <VisualStateManager.VisualStateGroups> <VisualStateGroup x:Name="ListViewStates"> <VisualState x:Name="ListSomethingSelectedState" /> <VisualState x:Name="ListNothingSelectedState"> <VisualState.StateTriggers> <!-- 改用x:Bind --> <triggers:IsNullOrEmptyStateTrigger Value="{x:Bind myListView.SelectedItem, Mode=OneWay}"/> </VisualState.StateTriggers> <VisualState.Setters> <Setter Target="myButton.IsEnabled" Value="False" /> </VisualState.Setters> </VisualState> </VisualStateGroup> </VisualStateManager.VisualStateGroups> <StackPanel> <ListView x:Name="myListView"> <TextBlock Text="Item 1" /> <TextBlock Text="Item 2" /> <TextBlock Text="Item 3" /> </ListView> <Button x:Name="myButton" Content="Click Me" /> </StackPanel> </Page>
修改后重新编译运行即可实现预期效果:无选中项时按钮禁用,选中任意项后按钮自动启用。
内容的提问来源于stack exchange,提问作者tronman
相关产品推荐
相关产品推荐

