绑定到属性并传递自定义StringFormat

时间:2017-03-13 21:39:31

标签: c# wpf mvvm

我目前正在构建一个帮助类,它将十进制格式坐标转换为人类可读的坐标。

我希望能够绑定到坐标并传递我定义的自定义格式。在我的Coordinate类中,我定义了这两种方法。

  public override string ToString()
  {
       return ToDegreeMinuteSecondString(1); //returns N ### ##' ###"
  }
  public string ToString(string format)
  {
     switch(format)
     {
         case "DMS": 
             return ToDecimalDegreeMinuteString(1); // returns N ### ##.###'               
     }
  }

我把所有其他案件都留下来保持简单,因为它们并不重要。

从这里我尝试绑定到我的XAML中的类属性,并传递一个字符串格式,但它不会。我尝试过不同的格式,我要么得到转换错误,要么默认使用ToString()覆盖方法。

 <TextBlock Text="{Binding ElementName=mw, Path=DataContext.Latitude, StringFormat='DMS'}"/>

我很好地实现了一个转换器来处理这个问题,但我想知道是否可以创建和传递自定义字符串格式。它会让生活更轻松。我到处搜索都无济于事。

编辑:我必须在我的Coordinate类上实现IFormattable。像魅力一样工作,我可以避免转换器。我非常喜欢它!

class Coordinate : IFormattable
{
  //Properties Omitted
  public override string ToString()
  {
       return ToDegreeMinuteSecondString(1); //returns N ### ##' ###"
  }
  public string ToString(string format, IFormatProvider formatProvider)
  {
    switch(format)
    {
        case "DMS": 
           return ToDecimalDegreeMinuteString(1); // returns N ### ##.###'               
    }
  }
}

2 个答案:

答案 0 :(得分:1)

如果您希望ICustomFormatter使用string.Format,那么您需要在您的课程上实施StringFormat - 这可能是{{1}}属性最终结束的地方

答案 1 :(得分:0)

StringFormat应用于binding赢了会自动导致ToString(string format)方法被调用,如果这是您的想法。

您可以使用为您调用该方法的转换器:

namespace WpfApp2
{
    public class MyConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            Coordinate c = value as Coordinate;
            if(c != null)
            {
                return c.ToString(parameter as string);
            }

            return value;
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new NotSupportedException();
        }
    }
}
<Grid xmlns:local="clr-namespace:WpfApp2">
    <Grid.Resources>
        <local:MyConverter x:Key="conv" />
    </Grid.Resources>
    <TextBlock Text="{Binding ElementName=mw, Path=DataContext.Latitude, Converter={StaticResource conv}, ConverterParameter='DMS'}"/>
</Grid>