根据绑定的布尔值设置TextBlock的可见性

3

我正在尝试使用WPF和C#将TextBlock的可见性链接到一个布尔属性,该属性也链接到复选框。在同一XAML文件的两个不同部分中都有以下代码(一个部分是概述,另一个部分是设置)。我非常新手,正在学习过程中。目前,无论IsSecondaryMessageFilePath的值如何,TextBlock始终可见。

<TextBlock Name="secondaryfolderinfo" Foreground="Red">
    <ContentControl Content="Secondary message folder" Foreground ="Black" />                    
    <ContentControl Content = "{Binding Path=SecondaryMessageFilePath}" ContentStringFormat="" ClipToBounds="False"></ContentControl>
    <ContentControl Content = "   "></ContentControl>
    <TextBlock.Style>
        <Style TargetType="{x:Type TextBlock}">
            <Style.Triggers>
                <DataTrigger Binding="{Binding Path=IsSecondaryMessageFilePath}" Value="True">
                    <Setter Property="Visibility" Value="Visible"></Setter>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </TextBlock.Style>
</TextBlock>

在下面,我有:

<CheckBox IsChecked="{Binding Path=IsSecondaryMessageFilePath, Mode=TwoWay}"
    Name="SecondaryPathCheckBox"
    VerticalAlignment="Top"
    HorizontalAlignment="Left"
    Margin="320,7,0,0">Save additional locations</CheckBox>

最后,在代码后台,我有以下内容:
public bool IsSecondaryMessageFilePath
{
    get { return _isSecondaryMessageFilePath; }
    set
    {
        if (_isSecondaryMessageFilePath != value)
        {
            _isSecondaryMessageFilePath = value;
            OnPropertyChanged("IsSecondaryMessageFilePath");
        }
    }
}
private bool _isSecondaryMessageFilePath;

public string SecondaryMessageFilePath
{
    get { return _secondaryMessageFilePath; }
    set
    {
        if (_secondaryMessageFilePath != value)
        {
            _secondaryMessageFilePath = value;
            OnPropertyChanged("SecondaryMessageFilePath");
        }
    }
}
private string _secondaryMessageFilePath;

任何帮助都将不胜感激。
编辑:
根据下面的建议,我尝试添加BooleanToVisibilityConverter,但是遇到了它的缺失程序集引用,并且对WPF太新以至于无法解决它。我的开头代码如下:
    <UserControl x:Class="Sender_Receiver.SenderReceiverSetup"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:diagnostics="clr-namespace:System.Diagnostics;assembly=WindowsBase"
    xmlns:m=...
    xmlns:

    <UserControl.Resources>
        <BooleanToVisibiltyConverter x:Key="BooleanToVisibilityConverter"/>
...
2个回答

4

一开始看起来你的代码没什么问题,但是实际上你并不需要使用数据触发器。WPF自带一个BooleanToVisibilityConverter类,在你的资源中声明即可:

<BooleanToVisibiltyConverter x:Key="BooleanToVisibilityConverter"/>

那么在您的TextBlock中,您将绑定可见性:
<TextBlock Visibility="{Binding Path=IsSecondaryMessageFilePath, Converter={StaticResource BooleanToVisibilityConverter}}"/>

只是为了让您知道,可能有一种更简单的方法来完成这个操作,只需绑定到IsChecked属性本身!
<CheckBox x:Name="UseSecondaryPath"/>
<TextBlock Visibility="{Binding ElementName=UseSecondaryPath, Path=IsChecked, Converter={StaticResource BooleanToVisibilityConverter}}"/>

当然,如果您需要对布尔值进行其他操作,这可能不是最理想的解决方案,但如果仅用于UI,则会更加简洁。

如果您感兴趣,自定义BooleanToVisibilityConverter的代码如下:

public class BooleanToVisibilityConverter : IValueConverter
{
   public object Convert (object value, ...)
   {
       if ((bool)value)
          return Visibility.Visible;
       else
          return Visibility.Collapsed;
   }

   public object ConvertBack(object value, ...)
   {
      return Binding.DoNothing;
   }
}

如果需要澄清任何事情或需要进一步帮助,请让我知道。


你不需要为System.Windows.Controls添加命名空间。你尝试过构建吗?XAML解析器在警告转换器之类的事情上非常糟糕,直到你实际构建才会发出警告。如果由于某种原因你没有它(.NET版本?),我可以发布它的代码,这是一个非常简单的转换器 :) - BradleyDotNET
我尝试重新构建,但出现错误:“在XML命名空间'http://schemas.microsoft.com/winfx/2006/xaml/presentation'中不存在'tab' BooleanToVisibilityCoverter”。 - Tim
1
你的类名拼写错误(缺少最后一个“i”),抱歉我之前没有注意到。 - BradleyDotNET
我已经很久没有犯这样的错误了。我太忙于担心自己在WPF上不知所措,以至于没有注意到明显的错误。现在我已经放置了代码,但不幸的是,可复选框仍然无法控制可见性。使用WPF进行调试很困难,因为您似乎无法中断代码,即使Debug.WriteLines也由于某种原因未被触发。我试图查看属性是否正在更新,但并不太成功。 - Tim
假设您拥有外部应用程序的源代码,我已经通过附加到外部应用程序,使得调试可以在该场景下工作。它甚至可以打开“插件”源代码!最后一个细节可能是VS2012的特性... - BradleyDotNET
显示剩余7条评论

2
private Boolean _IsChecked;
//Bind this to your checkbox
public Boolean IsChecked
{
    get { return _IsChecked; }
    set { _IsChecked= value; OnPropertyChanged("IsChecked"); OnPropertyChanged("TextBoxVis"); }
}


//Bind this to your TextBox's Visibility Property
public Visibility TextBoxVis
{
    get { return IsChecked ? Visibility.Visible : Visibility.Collapsed; }
}

从技术上讲,这是可行的。然而,这正是转换器的作用。 - BradleyDotNET
@LordTakkera 不是技术上的问题。这确实可行并且是一个可靠的解决方案。当你从数据库中取出类似于1,2,3这样的值,并想将它们转换为像Green,Pineapple和Web这样的值时,转换器更有效。你经常会看到这样的代码。 - DotNetRussell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接