繁体   English   中英

将 bool 绑定到代码中的可见性

[英]Binding bool to visibility in code behind

我想根据后面代码的 boolean 变量的 state 更改 TextBlock 的可见性

<TextBlock Text="Hello">
    <TextBlock.Style>
        <Style TargetType="{x:Type TextBlock}">
            <Setter Property="Visibility" Value="Collapsed"/>
            <Style.Triggers>
                <DataTrigger Binding="{Binding IsVisible}" Value="True">
                    <Setter Property="Visibility" Value="Visible"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </TextBlock.Style>
</TextBlock>

这不起作用:(

    private bool _isVisible = false;
    public bool IsVisible
    {
        get { return _isVisible; }
        set
        {
            _isVisible = value;
            NotifyPropertyChanged();
        }
    }

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

问题出在您的属性IsVisible中。 您位于WindowUserControl的 CodeBehind 中,因此已经有一个名为IsVisible的属性来自Window / UserControl

只需将您的属性名称更改为IsCurrentlyVisible之类的名称,您的代码就可以运行。

如果您的代码中有更多位置必须设置依赖于布尔属性的控件的Visibility ,我建议您使用转换器而不是样式。

用于将布尔值转换为Visibility的转换器类如下所示:

using System;
using System.Globalization;
using System.Windows;
using System.Windows.Data;
using System.Windows.Markup;

namespace Playground
{
    internal class BoolToVisibilityConverter : MarkupExtension, IValueConverter
    {
        private static BoolToVisibilityConverter converter;

        // ReSharper disable once EmptyConstructor
        public BoolToVisibilityConverter()
        {

        }

        public override object ProvideValue(IServiceProvider serviceProvider)
        {
            return converter ?? (converter = new BoolToVisibilityConverter());
        }

        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (value is bool b && b)
                return Visibility.Visible;
            return Visibility.Collapsed;
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }
}

这个转换器的使用很简单:

<TextBlock Text="Hello" Visibility="{Binding IsCurrentlyVisible, Converter={local:BoolToVisibilityConverter}}"/>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM