2010-01-23 69 views
14

好绑定可见性,所以这里是我的XAML:WPF:由字符串内容

<TextBlock Text="{Binding Path=InstanceName}"></TextBlock> 

如果InstanceName为空或空字符串,我想Visibility="Collapsed"。否则,我想Visibility="Visible"。我会怎么做?

回答

40

你可以使用一个ValueConverter:

<TextBlock 
    Visibility="{Binding InstanceName, Converter={local:StringNullOrEmptyToVisibilityConverter}}" 
    Text="{Binding InstanceName}"/> 

与下列代码隐藏:

public class StringNullOrEmptyToVisibilityConverter : System.Windows.Markup.MarkupExtension, IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     return string.IsNullOrEmpty(value as string) 
      ? Visibility.Collapsed : Visibility.Visible; 
    } 
    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     return null; 
    } 
    public override object ProvideValue(IServiceProvider serviceProvider) 
    {    
     return this; 
    } 
} 
+0

我可以看到工作,但这将变得非常繁琐快速。我不禁想到有一个更好的方法。 – 2010-01-23 17:48:13

+6

你认为这将是一个乏味的部分?你认为分别设置可视性和文本可能会变得乏味吗?或者你认为一般的价值转换者是如此吗? 我会改变的一件事是绑定可见性属性与relativesource自我与路径=名称,以便您不重复“InstanceName”! 除此之外,我不明白这可能会变得单调乏味 (您可以随时编写自己的MarkupExtensions,甚至可以做一个可以做到这一点的行为,但我认为它已经超过了顶部,并且valueconverter将会是正确的事) – 2010-01-23 18:20:55

0

通过将在您的视图模型可以绑定的可见性属性额外的属性:

public class ViewModel 
{ 
    public string InstanceName {...} 
    public string Visibility InstanceVisibility 
    { 
     get 
     { 
      return String.IsNullOrEmpty(InstanceName) ? Visibility.Collapsed : Visibility.Visible; 
     } 
} 
+1

我不喜欢那样。该模型需要被多个视图共享,但只有这个行为是必需的。 – 2010-01-23 17:28:22

+1

Imo视图和视图模型之间存在一对一的关系。如果你有共享一些常见功能的视图,你可以提取常见的部分,也许把它们放在一个普通的viewmodel超类中。 – 2010-01-23 22:06:56

+0

这听起来不对。我对'ViewModels'不熟悉,但对于经典的MVC,多个视图可以绑定到同一个模型实例。通过这种方式,您可以在一个窗口中进行编辑,并在另一个窗口中实时更新。 – 2010-01-25 01:44:03

3

如果你是一个(数据并行)模板中可以使用触发器了点。

否则,MVVM-PatternValueConverter将帮助您。

+0

+1值转换器更正确。 – 2010-01-23 13:43:37

+0

触发器和ValueConverter都不易测试。 – 2010-01-23 16:42:20

+2

没有一个是“可测试的”,因为唯一真正的测试是目测检查结果以获得所需的效果。 – 2010-01-23 17:46:14

0
<TextBlock Text="{Binding Path=InstanceName},FallbackValue={x:Null}"></TextBlock> 

然后添加一个DataTrigger来检查值为空,并使用Setter更改可视性。 这是iam使用的简单方法。

+0

有趣。但是,这将无法与InstanceName == String.Empty ... – 2010-01-23 11:54:19

0

好了,这是密切与PyBinding:

<TextBlock Text="{Binding Path=InstanceName}" Visibility="{p:PyBinding BooleanToVisibility(IsNotNull($[.InstanceName]))}" ></TextBlock> 

我需要更换IsNotNull这意味着IsNotNullOrEmpty,但我越来越近了。