如何在WPF中将字符串绑定为double?

时间:2009-05-10 12:54:01

标签: wpf binding

我想设置绑定。问题是目标是string类型,但源是double类型。 在以下代码中,VersionNumber的类型为double。当我运行它时,文本块是空的,没有抛出任何异常。 如何设置此绑定?

<Style TargetType="{x:Type MyControl}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type MyControl}">
                <TextBlock Text="{TemplateBinding Property=VersionNumber}" />
            </ControlTemplate>
        </Setter.Value>
    </Setter>        
</Style>

3 个答案:

答案 0 :(得分:5)

你需要一个转换器:

namespace Jahedsoft
{
    [ValueConversion(typeof(object), typeof(string))]
    public class StringConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            return value == null ? null : value.ToString();
        }

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

现在您可以像这样使用它:

<ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:j="clr-namespace:Jahedsoft">

    <j:StringConverter x:Key="StringConverter" />
</ResourceDictionary>

...

<Style TargetType="{x:Type MyControl}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type MyControl}">
                <TextBlock Text="{TemplateBinding Property=VersionNumber, Converter={StaticResource StringConverter}}" />
            </ControlTemplate>
        </Setter.Value>
    </Setter>        
</Style>

答案 1 :(得分:4)

示例中存在细微差别。

如果您在Window或其他控件中直接使用Texblock,则将double绑定到Text属性可正常工作,因为它默认返回ToString()方法,但如果您尝试在的ControlTemplate。

然后你需要一个类似于帖子中建议的转换器。

答案 2 :(得分:3)

您不需要ValueConverter。 Double to String目标工作得很好。作为一项规则,Binding将调用ToString()作为最后的手段。

以下是一个例子:

<Window x:Class="WpfApplication1.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        x:Name="w1">
        <TextBlock Text="{Binding Path=Version, ElementName=w1}" />
</Window>
using System;
using System.Windows;
namespace WpfApplication1
{
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();
        }
        public double Version { get { return 2.221; } }
    }
}

问题可能是您的绑定源不是您认为的那样。 通常,WPF中的绑定失败不会引发异常。但他们确实记录了他们的失败。见How can I debug WPF bindings?