通过绑定显示字符串而不是小数,具体取决于条件

本文关键字:小数 条件 取决于 绑定 显示 字符串 | 更新日期: 2023-09-27 17:55:13

我有一个XAML用户控件,它只有一个矩形和一个文本块。Text 属性是通过与十进制类型的依赖项属性绑定来设置的。

XAML:

<UserControl x:Class="UserControls.TotalsDataGridCellContentControl"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    <Grid x:Name="LayoutRoot">
        <Rectangle Fill="{Binding IsValid, Converter={StaticResource isValidConverter}, ElementName=Root}"
                   HorizontalAlignment="Stretch" />
        <TextBlock Grid.Column="1"
                   Text="{Binding Total, ElementName=Root}"
                   HorizontalAlignment="Right"
                   Margin="0 2 3 0" />
    </Grid>
</UserControl>

C#:

public decimal Total
{
    get { return (decimal)GetValue(TotalProperty); }
    set { SetValue(TotalProperty, value); }
}
public static readonly DependencyProperty TotalProperty = 
    DependencyProperty.Register("Total", 
                                typeof(decimal),
                                typeof(TotalsDataGridCellContentControl), 
                                new PropertyMetadata(TotalChanged));
private static void TotalChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
}

现在,如果不满足某些条件,我需要在文本块中显示类似N/A的字符串。所以通常如果满足条件,Total的值应该显示在 TextBlock 中,否则是像 N/A 这样的字符串。

有没有简单的方法?例如,添加另一个属性(字符串),根据条件设置值并将该属性绑定到 TextBlock?

我听说过StringFormat以特定的给定格式显示数字、日期等,但我认为这对这种情况没有任何用处。

通过绑定显示字符串而不是小数,具体取决于条件

以下内容应该适合您的需求,同时(希望)足够简单:

<Label Content="{Binding TestProp}">
   <Label.Style>
      <Style TargetType="Label">
         <Style.Triggers>
            <DataTrigger Binding="{Binding TestProp}" Value="12">
               <Setter Property="ContentStringFormat" Value="N/A" />
            </DataTrigger>
         </Style.Triggers>
      </Style>
   </Label.Style>
</Label>

在此示例中,如果值为 12,则显示的字符串将更改为"N/A"(尽管显然您需要以不同的方式设置触发器)。

您有以下选项:

如果你的条件永远不能改变(所以唯一改变的是Total的值),你可以实现IValueConverter.Convert(你不需要实现ConvertBack)并确定里面的返回值。

return (MeetsCondition((decimal)value)) ? value : "N/A";

XAML 用法:

Text="{Binding Total, ElementName=Root, Converter={StaticResource MyValueConverter}}"

但是,如果你的条件改变,只要Total不改变,你的绑定就不会被评估。因此将显示错误的结果。

您的第二个选择:在代码中引入一个结果属性,每次条件或Total更改时都会重新计算该属性。将Text绑定到它。

private static void TotalChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
    ((TotalsDataGridCellContentControl)d).EvaluateCondition();
}
private static void ConditionChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
    ((TotalsDataGridCellContentControl)d).EvaluateCondition();
}

你的第三个选择(我认为有点太"胖"了):为"条件满足"和"条件不满意"定义VisualStates"条件评估状态",并根据状态显示不同的视觉元素。