带有绑定StringFormat问题的自定义按钮模板

时间:2012-12-01 05:30:56

标签: wpf binding string-formatting

当我处理按钮模板时,我刚遇到绑定StringFormat问题。在这里。

- 我设置了一个带有给定ToolTip的按钮作为字符串。我喜欢用它来指定绑定中的图像名称。然后我将它应用于名为ImageButton的按钮样式。

<Button ToolTip="Minimize" Height="34" Style="{StaticResource ImageButton}"  Margin="220,36,125,371" />;

- 这是代码风格。我喜欢使用绑定中的图像名称,并想出一个完整的图像路径。它应该是这样的,<Image x:Name="ButtonImage" Source="Images/Minimize-Normal.png" />。是的,我确实有这样的图像,如果我只是把xml代码放在没有绑定的情况下它就会很好用。

<Image x:Name="ButtonImage" Source="{Binding ToolTip, RelativeSource={RelativeSource TemplatedParent}, StringFormat={}Images/{0}-Normal.png}" />

但绑定并没有像我预期的那样有效。图像无法正确显示。如果我将图像全名放在ToolTip中,那么它的工作正确。看起来StringFormat已被忽略。

任何帮助将不胜感激。提前谢谢。


感谢dbaseman的回复。我知道我可以使用Converter实现它。但正如我认为StringFormat更容易应用,这就是我尝试这个的原因。

我在这里也找到了回复,它说 - 绑定到字符串属性时使用StringFormat,而控件中的Text属性是object类型,因此会忽略StringFormat。


它应该是设计的。下面的代码工作。因为Text属性是字符串类型。

<TextBlock Text="{Binding ToolTip, RelativeSource={RelativeSource Self}, StringFormat={}Images/{0}-Normal.png}" ToolTip="Minimize" />

1 个答案:

答案 0 :(得分:0)

这很有意思 - 我不确定这是一个错误,还是设计错误。但是,您可以使用Converter代替StringFormat来解决此问题。

public class ImageNameConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return string.Format("Images/{0}-Normal.png", value);
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

然后当然:

<local:ImageNameConverter x:Key="ImageNameConverter" />

<Image x:Name="ButtonImage" 
    Source="{Binding ToolTip, 
                RelativeSource={RelativeSource TemplatedParent}, 
                Converter="{StaticResource ImageNameConverter}}" />

编辑我认为这是设计的。来自docs for BindingBase.StringFormat

  

获取或设置一个字符串,该字符串指定如果将绑定值显示为字符串,如何格式化绑定。

所以(显然)除非将绑定源实际呈现为文本字符串,否则不会发生字符串格式转换。