UWP IsNullOrEmptyStateTrigger 不适用于 ListView

Posted

技术标签:

【中文标题】UWP IsNullOrEmptyStateTrigger 不适用于 ListView【英文标题】:UWP IsNullOrEmptyStateTrigger not working for ListView 【发布时间】:2022-01-08 11:54:33 【问题描述】:

下面的 XAML 适用于使用 VisualStateManager 和来自 Microsoft.Toolkit.Uwp.UI 包的 IsNullOrEmptyStateTrigger 的 UWP 应用。当没有从 ListView 中选择任何项目时,触发器应该禁用按钮。但是,该按钮始终保持启用状态。

ListView 的SelectedItem 在列表中没有选择任何内容时应该为空(首次运行应用程序时没有选择任何内容)。有什么想法吗?

我的代码大致基于this example。

<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">

    <StackPanel>
        <VisualStateManager.VisualStateGroups>
            <VisualStateGroup x:Name="ListViewStates">
                <VisualState x:Name="ListSomethingSelectedState" />
                <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>

        </VisualStateManager.VisualStateGroups>

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

【问题讨论】:

【参考方案1】:

UWP IsNullOrEmptyStateTrigger 不适用于 ListView

我们可以重现您的问题,请随时在WindowsCommunityToolkit 问题框中发布此问题。目前,这是一种手动控制 myButton 状态的解决方法。在后面的代码中创建IsEnable 属性并将其绑定到 myButton。并更新 SelectItem 设置方法中的 IsEnable 值。更多内容请参考以下代码。

private bool _isEnable;
public bool IsEnable

    get
    
        return _isEnable;
    
    set
    
        _isEnable = value;
        OnPropertyChanged();
    

private string _selectItem;
public string SelectItem

    get
    
        return _selectItem;
    
    set
    
        _selectItem = value;
        if(_selectItem == null)
        
            IsEnable = false;
        
        else
        
            IsEnable = true;
        
        OnPropertyChanged();
    

Xaml

<ListView
    x:Name="myListView"
    IsItemClickEnabled="True"       
    SelectedItem="Binding SelectItem, Mode=TwoWay">
    <x:String>Hello</x:String>
    <x:String>Hello</x:String>
    <x:String>Hello</x:String>
    <x:String>Hello</x:String>
</ListView>
<Button
    x:Name="myButton"
    Content="Click Me"
    IsEnabled="Binding IsEnable" />

【讨论】:

以上是关于UWP IsNullOrEmptyStateTrigger 不适用于 ListView的主要内容,如果未能解决你的问题,请参考以下文章

2019-11-25-加强版在国内分发-UWP-应用正确方式-通过win32安装UWP应用

为啥必须在 UWP 中使用 StreamSocketListener 而不是 TcpListener,尽管 UWP 是 .NET Core 的子集,而 TcpListener 在 UWP 中可用?

UWP使用AppService向另一个UWP客户端应用程序提供服务

[UWP]涨姿势UWP源码——IsolatedStorage

win10 uwp 如何开始写 uwp 程序

起调UWP的几种方法