【问题标题】:DataTrigger on StringFormat in WPFWPF中StringFormat上的DataTrigger
【发布时间】:2012-04-02 17:37:51
【问题描述】:

当我将对象绑定到 WPF 控件时,我希望根据所使用的单位系统以不同的精度级别显示属性。例如,我有一个属性IsMetric,如果值为真,我想显示小数点后一位的值,如果为假,则显示小数点后三位。目前我正在添加一个静态资源字符串,该字符串在调用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。

另一个选项是在对象中有一个格式属性并将 StringFormat 绑定到该属性,但我更愿意远离这个。有任何想法吗? 谢谢。

【问题讨论】:

  • 你考虑过多值转换器吗?
  • 转换器也有System.Globalization.CultureInfo culture参数可以使用。

标签: c# wpf data-binding


【解决方案1】:

真的,我认为最简单的事情是在 Room 类中拥有一个属性 BreadthString,只要您记得在适当的设置器上发送正确的通知。

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 中有一个“格式”属性 - 我认为它不会起作用,因为 StringFormat 不是依赖对象中的依赖属性(我可能在这里错了),但还有很多其他方法。例如,您可以有一个客户转换器(特别是,如果需要提供的属性超过 Breadth 属性)。或者,您可以有一个从 TextBlock 派生的自定义控件。或者您可以有两个 DataTemplates 和一个 TemplateTemplateSelector。或者你可以有一个 ControlTemplate。

【讨论】:

  • “我不认为它会起作用,因为 StringFormat 不是依赖对象中的依赖属性” - 你是对的
  • 我没有太多成功。我看了你的大部分建议都没有成功,目前我在这里尝试使用转换器方法stackoverflow.com/questions/9982117/…
猜你喜欢
  • 2017-02-16
  • 2013-12-30
  • 1970-01-01
  • 2023-04-01
  • 2016-06-18
  • 2013-06-04
  • 2013-03-12
  • 1970-01-01
  • 2011-08-17
相关资源
最近更新 更多