好绑定可见性,所以这里是我的XAML:WPF:由字符串内容
<TextBlock Text="{Binding Path=InstanceName}"></TextBlock>
如果InstanceName
为空或空字符串,我想Visibility="Collapsed"
。否则,我想Visibility="Visible"
。我会怎么做?
好绑定可见性,所以这里是我的XAML:WPF:由字符串内容
<TextBlock Text="{Binding Path=InstanceName}"></TextBlock>
如果InstanceName
为空或空字符串,我想Visibility="Collapsed"
。否则,我想Visibility="Visible"
。我会怎么做?
你可以使用一个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;
}
}
通过将在您的视图模型可以绑定的可见性属性额外的属性:
public class ViewModel
{
public string InstanceName {...}
public string Visibility InstanceVisibility
{
get
{
return String.IsNullOrEmpty(InstanceName) ? Visibility.Collapsed : Visibility.Visible;
}
}
我不喜欢那样。该模型需要被多个视图共享,但只有这个行为是必需的。 – 2010-01-23 17:28:22
Imo视图和视图模型之间存在一对一的关系。如果你有共享一些常见功能的视图,你可以提取常见的部分,也许把它们放在一个普通的viewmodel超类中。 – 2010-01-23 22:06:56
这听起来不对。我对'ViewModels'不熟悉,但对于经典的MVC,多个视图可以绑定到同一个模型实例。通过这种方式,您可以在一个窗口中进行编辑,并在另一个窗口中实时更新。 – 2010-01-25 01:44:03
如果你是一个(数据并行)模板中可以使用触发器了点。
否则,MVVM-Pattern或ValueConverter将帮助您。
+1值转换器更正确。 – 2010-01-23 13:43:37
触发器和ValueConverter都不易测试。 – 2010-01-23 16:42:20
没有一个是“可测试的”,因为唯一真正的测试是目测检查结果以获得所需的效果。 – 2010-01-23 17:46:14
<TextBlock Text="{Binding Path=InstanceName},FallbackValue={x:Null}"></TextBlock>
然后添加一个DataTrigger来检查值为空,并使用Setter更改可视性。 这是iam使用的简单方法。
有趣。但是,这将无法与InstanceName == String.Empty ... – 2010-01-23 11:54:19
好了,这是密切与PyBinding:
<TextBlock Text="{Binding Path=InstanceName}" Visibility="{p:PyBinding BooleanToVisibility(IsNotNull($[.InstanceName]))}" ></TextBlock>
我需要更换IsNotNull这意味着IsNotNullOrEmpty,但我越来越近了。
我可以看到工作,但这将变得非常繁琐快速。我不禁想到有一个更好的方法。 – 2010-01-23 17:48:13
你认为这将是一个乏味的部分?你认为分别设置可视性和文本可能会变得乏味吗?或者你认为一般的价值转换者是如此吗? 我会改变的一件事是绑定可见性属性与relativesource自我与路径=名称,以便您不重复“InstanceName”! 除此之外,我不明白这可能会变得单调乏味 (您可以随时编写自己的MarkupExtensions,甚至可以做一个可以做到这一点的行为,但我认为它已经超过了顶部,并且valueconverter将会是正确的事) – 2010-01-23 18:20:55