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

WinUI 3中如何将XAML组件的可见性绑定到模型属性?

WinUI 3 中 TextBlock 可见性绑定方案

方案1:绑定布尔值 + 使用内置转换器

WinUI 3 自带 BooleanToVisibilityConverter,可直接将布尔变量转换为Visibility枚举值。

步骤1:在ViewModel中添加布尔属性

确保ViewModel实现INotifyPropertyChanged接口(x:Bind依赖此接口触发UI更新):

using Microsoft.UI.Xaml;
using System.ComponentModel;
using System.Runtime.CompilerServices;

public class YourViewModel : INotifyPropertyChanged
{
    private bool _isTimeVisible;
    public bool IsTimeVisible
    {
        get => _isTimeVisible;
        set
        {
            if (_isTimeVisible != value)
            {
                _isTimeVisible = value;
                OnPropertyChanged();
            }
        }
    }

    // 实现INotifyPropertyChanged的必要方法
    public event PropertyChangedEventHandler PropertyChanged;
    private void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }

    // 原有Time属性
    public string Time { get; set; }
}

步骤2:在XAML中声明转换器并绑定

先在页面资源中声明内置转换器,再为TextBlock绑定属性并指定转换器:

<Page
    ...
    xmlns:converters="using:Microsoft.UI.Xaml.Controls">

    <Page.Resources>
        <!-- 声明布尔转可见性转换器 -->
        <BooleanToVisibilityConverter x:Key="BoolToVisConverter"/>
    </Page.Resources>

    <Grid>
        <!-- 绑定IsTimeVisible,通过转换器转为Visibility,模式设为OneWay以支持动态更新 -->
        <TextBlock Text="{x:Bind ViewModel.Time}" 
                   Visibility="{x:Bind ViewModel.IsTimeVisible, Converter={StaticResource BoolToVisConverter}, Mode=OneWay}"/>
    </Grid>
</Page>

方案2:直接绑定Visibility枚举属性

若无需转换器,可直接在ViewModel中声明Visibility类型的属性:

步骤1:ViewModel中添加Visibility属性

using Microsoft.UI.Xaml;
using System.ComponentModel;
using System.Runtime.CompilerServices;

public class YourViewModel : INotifyPropertyChanged
{
    private Visibility _timeVisibility;
    public Visibility TimeVisibility
    {
        get => _timeVisibility;
        set
        {
            if (_timeVisibility != value)
            {
                _timeVisibility = value;
                OnPropertyChanged();
            }
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    private void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }

    public string Time { get; set; }
}

步骤2:XAML中直接绑定

<TextBlock Text="{x:Bind ViewModel.Time}" 
           Visibility="{x:Bind ViewModel.TimeVisibility, Mode=OneWay}"/>

关键注意事项

  • x:Bind默认是OneTime模式,仅初始化时绑定一次,因此必须显式指定Mode=OneWay才能让UI随属性值动态更新。
  • 需确保ViewModel已正确关联到页面(比如页面的ViewModel属性已实例化并赋值)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 12:55:06