c# - 如何使用 Binding 在 TextBlock 中实现 NullText?

标签 c# wpf

我想为绑定(bind)到 ViewModel 中的属性的 TextBlock 实现“NullText”行为。当 ViewModel 中的该属性为 null 或空时,我想显示类似“No Data”的灰色斜体文本。我希望它遵循 MVVM 模式,但我迷路了......

更新 所以在尝试了 James Webster 建议的解决方案之后,我让它像这样工作......

<UserControl.Resources>
    <BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter" />
    <c:NullOrEmptyValueConverter x:Key="NullOrEmptyValueConverter" Text="(No Data)"/>
</UserControl.Resources>

 ...     

<TextBlock Name="SerialNumberTextBlock" Text="{Binding Path=SerialNumber, Converter={StaticResource NullOrEmptyValueConverter}}">
    <TextBlock.Resources>
        <Style TargetType="TextBlock">
            <Style.Triggers>
                <DataTrigger Binding="{Binding ElementName=SerialNumberTextBlock, Path=Text}" Value="(No Data)">
                    <Setter Property="FontStyle" Value="Italic"/>
               </DataTrigger>
           </Style.Triggers>
        </Style>
    </TextBlock.Resources>
</TextBlock>

最佳答案

我建议实现一个IValueConverter;如果源值不为 null 或为空,则将其传递给 TextBlock。如果源值为 null 或空,则呈现您选择的文本。

public class NullValueConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        string str = (string)value;
        if (str.IsNullOrWhitespace())
        {
            return "No Data";
        }
        return str;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        ... //An empty implementation I expect...
    }
}

但是我刚刚意识到您也想设置样式...嗯,如果值是我期望的“无数据”,可能是设置样式的 DataTrigger

<TextBlock Text="{Binding Path=SomeProperty, Converter={StaticResource keyToNullValueConverter}">
    <TextBlock.Triggers>
        <DataTrigger Binding="{Binding Path=Text}" Value="No Data">
            <Setter Property="FontStyle" Value="Italic"/>
        </DataTrigger>
    </TextBlock.Triggers>
</TextBlock>

按照这些思路可能会奏效。

关于c# - 如何使用 Binding 在 TextBlock 中实现 NullText?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5602254/

相关文章:

c# - 尝试使用 PcapDotNet 拆分数据包

c# - 如何为 LINQPad 设置 NetFx40_LegacySecurityPolicy?

c# - 所有内置 .Net 属性

c# - XmlSerializer、GenerateSerializer 和集合

c# - 通过使用 2D 变换旋转图像填充矩形来模拟透视

WPF:应用转换后我可以获取 UIElement 的大小吗?

c# - WPF 选择 DataGrid 中的所有 CheckBox

c# - 电子邮件格式的字符串变成超链接

WPF、用户控件或数据模板

wpf - 使用触发器进行复选框检查