【问题标题】:Binding bool to visibility in code behind将 bool 绑定到代码中的可见性
【发布时间】:2020-05-20 02:07:42
【问题描述】:

我想根据后面代码的布尔变量的状态,用 Binding 改变 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));
    }

【问题讨论】:

标签: c# wpf data-binding


【解决方案1】:

问题在于您的属性名称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}}"/>

【讨论】:

  • 这和docs.microsoft.com/en-us/dotnet/api/…有什么不同?
  • 不同,因为我的转换器是从MarkupExtension派生的。所以我不需要为它创建资源。我可以在需要的地方直接使用。
猜你喜欢
  • 2015-09-25
  • 2011-10-23
  • 2010-09-27
  • 1970-01-01
  • 2014-06-17
  • 2017-12-10
  • 1970-01-01
  • 2012-05-23
  • 1970-01-01
相关资源
最近更新 更多