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绑定到该属性,但我更愿意远离它。有什么想法吗?谢谢

DataTrigger on StringFormat in WPF

真的,我认为最简单的事情就是在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。