我有一个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
以特定的格式显示数字,日期等,但我不认为这种情况有用。
答案 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”,并根据状态显示不同的视觉元素。