条件文本绑定XAML



我有3个属性试图绑定到XAML中的Textblock。一个是条件字符串,另外两个是我想要根据该条件显示的字符串。

<TextBlock Text="{Binding TrueText}" Style="{StaticResource styleSimpleText}" Visibility="{Binding ShowTrueText, Converter={StaticResource boolToVisibilityConverter}}"/>
<TextBlock Text="{Binding FalseText}" Style="{StaticResource styleSimpleText}" Visibility="{Binding ShowTrueText, Converter={StaticResource invertedBoolToVisibilityConverter}}"/>

这是可行的,但现在文本块必须有不同的名称。我可以把它变成一个里面有条件的TextBlock吗?

您可以通过Style和DataTrigger:来实现这一点

<TextBlock>
    <TextBlock.Style>
        <Style TargetType="TextBlock">
            <Setter Property="Text" Value="{Binding FalseText}"/>
            <Style.Triggers>
                <DataTrigger Binding="{Binding ShowTrueText}" Value="True">
                    <Setter Property="Text" Value="{Binding TrueText}"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </TextBlock.Style>
</TextBlock>

另一种选择是使用带有多值转换器的MultiBinding:

<TextBlock>
    <TextBlock.Text>
        <MultiBinding Converter="{StaticResource TextConverter}">
            <Binding Path="TrueText"/>
            <Binding Path="FalseText"/>
            <Binding Path="ShowTrueText"/>
        </MultiBinding>
    </TextBlock.Text>
</TextBlock>

转换器看起来像这样:

public class TextConverter : IMultiValueConverter
{
    public object Convert(
        object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        var trueText = (string)values[0];
        var falseText = (string)values[1];
        var showTrueText = (bool)values[2];
        return showTrueText ? trueText : falseText;
    }
    public object[] ConvertBack(
        object value, Type[] targetTypes, object parameter, CultureInfo culture)
    {
        throw new NotSupportedException();
    }
}

我们为MVVM做这类事情的方法是在视图模型中为此创建一个属性。这允许您在视图模型上对您的条件进行单元测试。

视图模型中的属性将是TextBlock绑定到的字符串值。视图模型将在某个时刻根据您需要的条件逻辑确定该字符串的值。

是的,你可以,只需将它们包装在一个TextBlock中,如下所示:

<TextBlock x:name="myTextBlock" Style="{StaticResource styleSimpleText}">
    <TextBlock Text="{Binding TrueText}" Visibility="{Binding ShowTrueText, Converter={StaticResource boolToVisibilityConverter}}"/>
    <TextBlock Text="{Binding FalseText}" Visibility="{Binding ShowTrueText, Converter={StaticResource invertedBoolToVisibilityConverter}}"/>
</TextBlock>

然而,我认为最好的答案是克莱门斯提供的(使用DataTrigger)。

在我看来,这个问题的最佳解决方案是在视图模型中创建一个新的字符串属性,根据条件返回TrueTextFalseText。有了这样的属性,您可以只使用普通绑定。

public string TheNewProperty
{
    get
    {
        return ShowTrueText ? TrueText : FalseText;
    }
}
<TextBlock Text="{Binding TheNewProperty}" Style="{StaticResource styleSimpleText}"/>

您可以在视图模型中设置它,并让它确定要显示的文本。

private static readonly string TRUETEXT = "This is the text to show when true";
    private static readonly string FALSETEXT = "This is the text to show when false";
    private bool _myBooleanProperty;
    public bool MyBooleanProperty
    {
        get { return _myBooleanProperty; }
        set
        {
            if (_myBooleanProperty != value)
            {
                _myBooleanProperty = value;
                OnPropertyChanged("MyBooleanProperty");
                OnPropertyChanged("ResultText");
            }
        }
    }
    public string ResultText
    {
        get
        {
            return MyBooleanProperty ? TRUETEXT : FALSETEXT;
        }
    }

然后只需一个文本块就可以绑定到它。不需要可见性转换器
如果有一种状态不应该显示文本,那么您也可以在其中工作。

<TextBlock Text="{Binding ResultText}" Style="{StaticResource styleSimpleText}" />

最新更新