You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET MAUI中MultiTrigger无法正常工作的问题求助

问题原因分析

你的MultiTrigger逻辑错误——MultiTrigger的所有条件是**逻辑与(AND)**关系,必须同时满足才会触发,但ViolationRating不可能同时为null和空字符串,因此触发器永远不会执行,Label始终显示MultiBinding的默认结果(即"95 | ")。

解决方案

方案一:替换为两个DataTrigger

DataTrigger是单个条件触发,用两个DataTrigger分别处理null和空字符串的场景,满足任一条件就会覆盖Text值:

<HorizontalStackLayout>
    <Label Text="Inspection Score: "
           IsVisible="true"
           Style="{StaticResource CardTitleLabelStyle}"/>
    <Label
        HorizontalOptions="Start"
        VerticalOptions="Center"
        Style="{StaticResource CardTitleLabelStyle}">
        <Label.Text>
            <MultiBinding StringFormat="{}{0} | {1}">
                <Binding Path="ViolationScore" />
                <Binding Path="ViolationRating" />
            </MultiBinding>
        </Label.Text>
        <Label.Triggers>
            <!-- 处理null情况 -->
            <DataTrigger TargetType="Label" Binding="{Binding ViolationRating}" Value="{x:Null}">
                <Setter Property="Text" Value="{Binding ViolationScore}" />
            </DataTrigger>
            <!-- 处理空字符串情况 -->
            <DataTrigger TargetType="Label" Binding="{Binding ViolationRating}" Value="">
                <Setter Property="Text" Value="{Binding ViolationScore}" />
            </DataTrigger>
        </Label.Triggers>
    </Label>
</HorizontalStackLayout>

方案二:使用IMultiValueConverter(更简洁)

通过转换器直接处理显示逻辑,无需触发器:

1. 实现转换器

public class ScoreRatingConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        if (values.Length < 2) return string.Empty;
        
        var score = values[0]?.ToString() ?? string.Empty;
        var rating = values[1]?.ToString() ?? string.Empty;
        
        // 当rating为空或null时,仅显示score;否则显示组合格式
        return string.IsNullOrEmpty(rating) ? score : $"{score} | {rating}";
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException(); // 双向绑定不需要,直接抛出异常
    }
}

2. 在XAML中引用并使用转换器

<!-- 在页面资源中注册转换器 -->
<ContentPage.Resources>
    <local:ScoreRatingConverter x:Key="ScoreRatingConverter" />
</ContentPage.Resources>

<!-- 修改Label的Text绑定 -->
<HorizontalStackLayout>
    <Label Text="Inspection Score: "
           IsVisible="true"
           Style="{StaticResource CardTitleLabelStyle}"/>
    <Label
        HorizontalOptions="Start"
        VerticalOptions="Center"
        Style="{StaticResource CardTitleLabelStyle}">
        <Label.Text>
            <MultiBinding Converter="{StaticResource ScoreRatingConverter}">
                <Binding Path="ViolationScore" />
                <Binding Path="ViolationRating" />
            </MultiBinding>
        </Label.Text>
    </Label>
</HorizontalStackLayout>

内容的提问来源于stack exchange,提问作者Divyesh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 07:27:27