DataTrigger on StringFormat in WPF
本文关键字:WPF in StringFormat on DataTrigger | 更新日期: 2023-09-27 18:28:18
当我将对象绑定到WPF控件时,我希望根据所使用的单位系统显示不同精度级别的属性。例如,我有一个属性IsMetric
,如果值为true,我想用一个小数位显示这些值,如果它为false,则用三个小数位。目前,我正在添加一个静态资源字符串,该字符串在调用InitialiseComponent()
之前添加到构造函数中的资源中,如下所示:
public RoomDisplay(Room room)
{
string format = room.IsMetric ? "{0:0.0}" : "{0:0.000}";
this.Resources.Add("format", format);
InitializeComponent();
this.DataContext = room;
}
然后Xaml看起来是这样的:
<TextBlock Grid.Row="0" Grid.Column="1" Text="{Binding Path=Breadth, StringFormat={StaticResource ResourceKey=format}}" TextAlignment="Right" />
这一直有效到现在。然而,这种方法因嵌入控件而失败,我对这种方法从来都不满意。
我调查了DataTriggers,大致如下:
<DataTrigger Binding="{Binding IsMetric}" Value="true">
<Setter Property="Text" Value="{Binding Breadth, StringFormat=F1}"/>
</DataTrigger>
<DataTrigger Binding="{Binding IsMetric}" Value="false">
<Setter Property="Text" Value="{Binding Breadth, StringFormat=F3}"/>
</DataTrigger>
然而,这是一个痛苦的添加到所有的文本块。理想情况下,我想把它放进一个样式中,但我想不出一种在没有文本值的情况下只设置StringFormat的方法。
另一种选择是在对象中有一个format属性,并将StringFormat绑定到该属性,但我更愿意远离它。有什么想法吗?谢谢
真的,我认为最简单的事情就是在Room类中有一个属性BreadthString,只要你记得在适当的setter上发送正确的通知。
class Room {
private double _breadth;
public Breadth {
get { return _breadth; }
set { _breadth = value; Raise("Breadth"); Raise("BreadthString"); }
}
private bool _isMetric;
public bool IsMetric {
get { return _isMetric; }
set { _isMetric = value; Raise("IsMetric"); Raise("BreadthString"); }
}
public string BreathString {
get { return Breadth.ToString( IsMetric ? "0.0" : "0.000" ); }
}
}
你建议在Room中有一个"format"属性——我认为它不起作用,因为StringFormat不是依赖对象中的依赖属性(我可能错了),但还有很多其他方法。例如,您可以有一个客户转换器(尤其是在必须呈现的内容超过"宽度"属性的情况下)。或者,您可以从TextBlock派生一个自定义控件。或者您可以有两个的DataTemplates和一个TemplateTemplateSelector。或者你可以有一个ControlTemplate。