通过绑定显示字符串而不是小数,具体取决于条件
本文关键字:小数 条件 取决于 绑定 显示 字符串 | 更新日期: 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
"条件评估状态",并根据状态显示不同的视觉元素。