根据条件通过绑定显示字符串而不是小数

时间:2014-03-31 12:59:05

标签: c# silverlight xaml dependency-properties

我有一个XAML UserControl,它只有一个Rectangle和一个TextBlock。 Text属性通过与十进制类型的DependencyProperty绑定来设置。

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)
{
}

现在,如果不满足某些条件,我需要在TextBlock中显示类似N/A的字符串。因此,通常如果满足条件,Total的值应显示在TextBlock中,否则应显示为N/A的字符串。

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

我听说StringFormat以特定的格式显示数字,日期等,但我不认为这种情况有用。

2 个答案:

答案 0 :(得分:1)

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

<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”(尽管显然您需要以不同方式设置触发器)。

答案 1 :(得分:1)

您有以下选择:

如果您的情况永远不会改变(所以唯一不变的是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();
}

你的第三个选择(我认为有点太“胖”): 为“ConditionSatisfied”和“ConditionNotSatisfied”定义VisualStates“ConditionEvaluationStates”,并根据状态显示不同的视觉元素。