我目前正在构建一个帮助类,它将十进制格式坐标转换为人类可读的坐标。
我希望能够绑定到坐标并传递我定义的自定义格式。在我的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 ### ##.###'
}
}
}
答案 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>