2012-03-17 78 views
0

在i对象绑定到一个WPF控制我想显示属性,以根据不同的单元系统上的不同级别的精确度被使用。例如,如果值为真,我有一个属性IsMetric我想显示一个小数位的值,如果它是假的,然后三位小数。目前,我将它添加到资源的调用之前的构造函数InitialiseComponent()这样的静态资源字符串:DataTrigger上的StringFormat在WPF

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> 

然而,这是一个痛苦添加到所有的TextBlocks。理想情况下,我想把它放入一个风格,但我不能找出一个方法来设置没有文本值的StringFormat。

的另一种选择是有对象的格式属性和绑定的StringFormat到,但我宁愿呆在远离这一切。有任何想法吗? 谢谢。

+1

你有没有考虑多值转换器? – Paparazzi 2012-03-17 12:54:33

+0

转换器也有你可以使用的'System.Globalization.CultureInfo culture'参数。 – Silvermind 2012-03-17 13:49:40

回答

1

说真的,我觉得最简单的事情是在房间类有一个属性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"); } 
    } 
} 

您建议有一个“格式”属性房间 - 我不认为这会工作,因为的StringFormat是不是在依赖对象的依赖属性(我可能是错在这里),但也有许多其他方式。例如,您可以有一个客户转换器(特别是,如果存在多于必须呈现的广度属性)。或者,您可以拥有从TextBlock派生的自定义控件。或者你可以有两个DataTemplates和一个TemplateTemplateSelector。或者你可以有一个ControlTemplate。

+0

“我不认为这会工作,因为的StringFormat是不是在依赖对象的依赖属性” - 你说得对,这 – 2012-03-19 11:04:24

+0

我并没有跟这么多sucess。我已经看了你的大部分建议没有成功,目前我正在尝试转换器的方法在这里http://stackoverflow.com/questions/9982117/ivalueconverter-with-bound-dependency-properties – 2012-04-02 19:01:27