WPF / XAML - 如果另一个控件的text属性为空/未设置,则隐藏图像

时间:2009-09-30 16:14:41

标签: wpf xaml binding

我是wpf的新手,这是我第一次尝试创建自定义用户控件。它的目的是显示两个值(myText1和myText2)及其相应的图像(myimage1,myimage2)。有时,其中一个值未设置,因此也应隐藏一个图像。这是我目前的代码:

Window1.xaml

<local:myControl myText2="Hello World!" />

myControl.xaml

<TextBlock Text="{Binding ElementName=myControl,Path=myText1}" />
<Image Source="myimage1.jpg" />

<TextBlock Text="{Binding ElementName=myControl,Path=myText2}" />
<Image Source="myimage2.jpg" />

myText1未在window1.xaml中设置,因此文本块保持为空。但图像仍然显示。如果未在window1.xaml中设置myText1(或myText2),我缺少哪些代码行来隐藏图像?

3 个答案:

答案 0 :(得分:2)

您已将文本转换为可见性

public class TextToVisibilityConverter : IValueConverter
{
    public object Convert(object value, System.Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value is string && targetType == typeof(bool))
        {
            if (value.ToString().Equals(string.Empty))
                 return Visibility.Hidden;
            else
                return Visibility.Hidden;
         }
        else
        {
            return null;
        }
    }

    public object ConvertBack(object value, System.Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value is Visibility && targetType == typeof(string))
        {
            if ((Visibility)value == Visibility.Visible)
            {
                return "Text";
            }
            else
            {
                return string.Empty;
            }
        }
        else
        {
            return null;
        }
    }
}

在XAML&lt; TextToVisibilityConverter x:Key =“myCnverter”/&gt;

答案 1 :(得分:1)

那里有一些小错误:

if (value is string && targetType == typeof(bool))  
    {            
    if (value.ToString().Equals(string.Empty))  
        return Visibility.Hidden;  
    else  
        return Visibility.Hidden;  
    }

应该是

if (value is string && targetType == typeof(Visibility))  
    {            
    if (value.ToString().Equals(string.Empty))  
        return Visibility.Hidden;  
    else  
        return Visibility.Visible;  
    }

您需要以下用途:

using System.Windows;
using System.Windows.Data;

您也可以考虑返回Visibility.Collapsed而不是Visibility.Hidden

答案 2 :(得分:0)

一旦你创建了正确的转换器,那么很容易。 并没有太多的答案也得到Text.IsEmpty可用于TextBlock Text属性

我创建了一个BooleanVisibilityConverter,它取决于boolean对True或False的参数。 给你的!xaml缺少真正的灵活性。

public class BooleanVisibilityConverter : IValueConverter
{       
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        Visibility v = Visibility.Collapsed;
        bool checkValue = true;
        if(parameter != null)
        {
            checkValue = Boolean.Parse(parameter.ToString());
        }
        if(value.Equals(checkValue))
        {
            v = Visibility.Visible;
        }
        return v;
    }

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

然后在你的xaml中将该命名空间导入:

xmlns:conv="clr-namespace:ConvertersNamespace"

在资源中创建转换器:

<UserControl.Resources>
    <conv:BooleanVisibilityConverter x:Key="bool2vis" />        
</UserControl.Resources>

然后只使用你的设计:

<TextBlock Text="{Binding ElementName=myControl,Path=myText1}" x:Name="txtBlock"/>
<Image Source="myimage1.jpg"  
       Visibility="{Binding ElementName=txtBlock,Path=Text.IsEmpty,
                     Converter={StaticResource bool2vis},ConverterParameter=False}"/>