[英]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
中。 您位于Window
或UserControl
的 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.