You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

UWP C++/WinRT:如何禁用GridView中的单个项

在C++/WinRT中实现GridView部分项禁用的方案

要实现GridView中部分项的禁用,核心思路是通过绑定视图模型的禁用状态属性控制GridViewItem的启用状态,以下是完整的C++/WinRT实现步骤:


1. 为DeviceViewModel添加可绑定的禁用状态属性

在DeviceViewModel中添加IsDisabled属性,并实现INotifyPropertyChanged接口支持属性变更通知:

namespace winrt::YourAppNamespace::viewModels
{
    struct DeviceViewModel : DeviceViewModelT<DeviceViewModel>, INotifyPropertyChanged
    {
        // 现有属性与方法...

        // 禁用状态属性
        bool IsDisabled() const { return m_isDisabled; }
        void IsDisabled(bool value)
        {
            if (m_isDisabled != value)
            {
                m_isDisabled = value;
                // 触发属性变更通知,更新UI
                PropertyChanged(*this, PropertyChangedEventArgs{L"IsDisabled"});
            }
        }

        // INotifyPropertyChanged接口实现
        event_token PropertyChanged(PropertyChangedEventHandler const& handler)
        {
            return m_propertyChanged.add(handler);
        }
        void PropertyChanged(event_token const& token) noexcept
        {
            m_propertyChanged.remove(token);
        }

    private:
        bool m_isDisabled = false;
        event<PropertyChangedEventHandler> m_propertyChanged;
    };
}

2. 创建布尔取反转换器

由于GridViewItem.IsEnabled为true表示启用,而IsDisabled为true表示禁用,需要转换器将布尔值取反:

namespace winrt::YourAppNamespace::converters
{
    struct BooleanNegationConverter : BooleanNegationConverterT<BooleanNegationConverter>, IValueConverter
    {
        IInspectable Convert(IInspectable const& value, TypeName const& targetType, IInspectable const& parameter, hstring const& language)
        {
            if (auto const* boolVal = value.try_as<bool>())
            {
                return box_value(!*boolVal);
            }
            return box_value(false);
        }

        IInspectable ConvertBack(IInspectable const& value, TypeName const& targetType, IInspectable const& parameter, hstring const& language)
        {
            if (auto const* boolVal = value.try_as<bool>())
            {
                return box_value(!*boolVal);
            }
            return box_value(false);
        }
    };
}

在XAML页面资源中注册转换器:

<Page.Resources>
    <converters:BooleanNegationConverter x:Key="BooleanNegationConverter"/>
</Page.Resources>

3. 修改GridView的ItemContainerStyle绑定启用状态

修改GridView的ItemContainerStyle,将IsEnabled属性绑定到DeviceViewModel.IsDisabled(通过转换器取反):

<GridView x:Name="DeviceTargets"
    x:Uid="SDeviceTargets"
    Grid.Row="1"
    x:DeferLoadStrategy="Lazy"
    Visibility="Collapsed"
    Margin="12 14 12 10"
    IsItemClickEnabled="True"
    ItemClick="OnDeviceTargetsItemClicked"
    ItemsSource="{x:Bind ViewModel.DeviceList, Mode=OneWay}"
    Padding="0"
    SelectionMode="None"
    ScrollViewer.HorizontalScrollMode="Disabled"
    ScrollViewer.VerticalScrollMode="Disabled">
    <!-- 覆盖原有ItemContainerStyle,绑定IsEnabled -->
    <GridView.ItemContainerStyle>
        <Style TargetType="GridViewItem" BasedOn="{StaticResource GridViewItemStyleSV}">
            <Setter Property="IsEnabled" Value="{x:Bind IsDisabled, Converter={StaticResource BooleanNegationConverter}, Mode=OneWay}"/>
        </Style>
    </GridView.ItemContainerStyle>
    <GridView.ItemTemplate>
        <DataTemplate x:DataType="viewModels:DeviceViewModel">
            <local:DeviceItem ViewModel="{x:Bind}"/>
        </DataTemplate>
    </GridView.ItemTemplate>
</GridView>

4. 动态控制项的禁用状态

在业务逻辑中,根据需求设置DeviceViewModel.IsDisabled的值,即可动态禁用/启用对应项:

// 示例:禁用第一个设备项
if (!ViewModel.DeviceList().empty())
{
    auto firstDevice = ViewModel.DeviceList().GetAt(0);
    firstDevice.IsDisabled(true);
}

补充说明

  • 禁用的GridViewItem不会触发ItemClick事件,无需额外在事件处理中判断状态。
  • 若要优化禁用项的视觉效果,可修改GridViewItemStyleSV样式中Disabled状态的模板,比如降低透明度、灰化内容等。

内容的提问来源于stack exchange,提问作者rsp

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 13:35:13